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

Ube*_*rto 14 java osgi maven apache-felix cradle

我们有一个很大的(约215个捆绑和计数)osgi(felix + springdm)项目,使用maven和maven-osgi插件构建.

我们用maven方式遇到了几个问题:

1.子模块pom必须继承父pom才能利用公共变量和依赖关系(没关系)但是父pom必须包含所有的包,以便能够一起构建所有内容.这种循环引用很难保持同步.

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

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

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

[编辑]在每个捆绑pom中有一个这样的部分:`

         <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>`
Run Code Online (Sandbox Code Playgroud)

出于所有这些原因,我们还可以,但对maven并不十分满意.最近有人提议Gradle不是灵丹妙药,而是对当前形势的明确改进.

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

有其他人遇到过同样的情况吗?我认为所有与Osgi的大项目都应该是共同的.

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

Buildr,Gradle还是等待Maven 3?

寻找OSGi包的良好开发环境

Maven:OSGI,捆绑和多模块项目

但要么在哪里不关于osgi submodules或不关于gradle.

Dan*_*hev 2

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

您可以将第谷放入可能的工具列表中。它将帮助您进行依赖项管理,因为您只需在清单中指定依赖项,并且它将允许您使用 API 工具(但尚未集成)。然而,如果您想跳过一些令人头疼的问题,它将要求您使用 p2 存储库(直到 Tycho 改进了对依赖 Maven 工件的支持)。