从 maven 切换到 gradle 来管理 osgi 大项目(>200 个捆绑包)

2022-09-04 04:48:11

我们有一个大的(~215个捆绑包,并且还在计数)osgi(felix + springdm)项目,使用maven和maven-osgi插件构建。

我们在 maven way 上有几个问题:

1. 子模块 pom 必须从父 pom 继承才能利用通用变量和依赖项(没关系),但父 pom 必须包含所有捆绑包 pom 才能一起构建所有内容。这种循环引用很难保持所有同步。

2.子捆绑的单个版本控制非常复杂,以至于(在我加入该项目之前)决定对所有捆绑包使用相同的版本。这意味着我们现在为每个版本更新所有捆绑包的版本,如果实际上只更改了一堆捆绑包。这使得osgi的整个概念有点毫无意义。请注意,我并不是说我们继续只接触少数捆绑包,我们处理所有这些捆绑包,但每个版本通常包含1或2个功能,这只影响一些捆绑包。

3.要完成包和最终工件的部署,我们还需要另一个子模块来导入部署所需的所有捆绑包(除了少数用于测试和模拟的捆绑包之外)。[编辑]请注意,此聚合与主 pom 中的聚合不同,因为它不编译捆绑包,而只是从 maven 存储库中选取它们。

4.maven依赖系统和osgi插件导入有时很难保持一致。忘记导入或放置错误的依赖项太容易了。

[编辑]在每个捆绑绒球中都有一个这样的部分:'

         <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Export-Package>
                    </Export-Package>
                    <Import-Package>
                        com.google.gson,
                        org.apache.log4j,
                        org.apache.log4j.spi,
                        org.dom4j,
                        com.myinterfaces
                    </Import-Package>
                </instructions>
            </configuration>
        </plugin>`

由于所有这些原因,我们还可以,但对maven并不完全满意。最近,有人提出Gradle不是作为灵丹妙药,而是作为对当前情况的明确改进。

你会建议搬到 gradle 吗?如果哪种方式是最好的方法?

其他人是否经历过同样的情况?我认为这对于Osgi的所有大型项目来说都应该是通用的。

免责声明:我寻找类似的问题,例如:

构建者,Gradle还是等待Maven 3?

为 OSGi 捆绑包寻找良好的开发环境

Maven : OSGI、捆绑包和多模块项目

但是要么不是关于osgi子模块,要么不是关于gradle。


答案 1
  1. 您可以分离父模块和聚合 maven 模块,因为当前您的父 pom 具有两个角色,正如您正确观察到的那样。更多信息可以在MAVEN介绍POM中找到。
  2. 恐怕捆绑包版本管理不会变得更容易,除非你使用API工具。如果API工具可以集成为Maven插件,也许会很棒,但我不知道在这方面有任何工作。因此,您可以一次触摸所有版本,也可以在每次需要时更新它们。API Tools在这里将有很大的帮助,但它仅适用于捆绑包,这些捆绑包可以作为Eclipse内部的插件项目导入。
  3. 那么,另一个聚合器模块会在这里提供帮助吗?您可以设置多个聚合器,这些聚合器聚合另一个聚合器,因此您最终不会得到一个列出所有内容的大型聚合器模块?因为,您可能不希望部署所有内容,因此您可以设置要从部署中排除的内容。快速谷歌搜索显示了如何做到这一点
  4. @Neil Bartlett已经指出,如果您正确设置了依赖项,bnd将负责您的清单。如果您需要对默认值进行额外调整,则始终可以设置BND指令文件。

您可以将第谷放在可能的工具列表中。它将帮助您进行依赖关系管理,因为您只需要在清单中指定依赖关系,并且它将允许您使用API工具(但尚未集成)。但是,如果您想跳过一些麻烦,则需要使用p2存储库(直到Tycho改进了对依赖于Maven工件的支持)。


答案 2

推荐