我们有一个大的(~215 个包,并且还在增加)osgi (felix+springdm) 项目,使用 maven 和 maven-osgi 插件构建。
我们有几个maven方式的问题:
1.子模块 pom 必须从父 pom 继承以利用公共(public)变量和依赖项(没关系),但是父 pom 必须包含所有包 pom 才能将所有内容构建在一起。这种循环引用使得保持所有同步变得非常困难。
2。子包的单独版本控制非常复杂,以至于(在我加入项目之前)决定对所有包使用相同的版本。这意味着我们现在也会为每个版本更新所有 bundle 的版本,即使实际上只是更改了其中的一部分。这使得 osgi 的整个概念有点毫无意义恕我直言。请注意,我并不是说我们会继续只接触一小部分 bundle ,我们会处理所有这些 bundle ,但每个版本通常包含 1 或 2 个功能,这些功能只会影响一些 bundle 。
3。为了完成最终 Artifact 的打包和部署,我们还需要另一个子模块来导入部署所需的所有包(除了一些用于测试和模拟的包)。 [编辑] 请注意,此聚合与主 pom 中的聚合不同,因为它不编译包,而只是从 maven 存储库中挑选它们。
4. Maven 依赖系统和 osgi 插件导入有时很难保持一致。忘记导入或放置错误的依赖项太容易了。
[编辑] 在每个 bundle 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>`
出于所有这些原因,我们对 maven 还不错,但不是很满意。最近有人提出 Gradle 不是 Elixir ,而是对当前情况的明确改进。
您会推荐迁移到 gradle 吗?哪种方法最好?
有没有人遇到过同样的情况?我认为它应该适用于所有使用 Osgi 的大型项目。
免责声明:我寻找过类似的问题,例如:
Buildr, Gradle or wait for Maven 3?
Looking for a good dev environment for OSGi bundles
Maven : OSGI, bundles and multi-modules projects
但无论是哪里与 osgi 子模块无关或与 gradle 无关。
最佳答案
- 您可以将父模块和聚合 maven 模块分开,因为正如您正确观察到的那样,目前您的父 pom 具有两个角色。更多信息可以在 Maven Introduction to POM 中找到.
- 除非你使用API Tools,否则恐怕捆绑版本管理不会变得更容易。 .如果 API 工具可以集成为 Maven 插件,也许会很棒,但我不知道这方面的任何工作。因此,您要么一次接触所有版本,要么在每次需要时更新它们。 API 工具将在此处提供很大帮助,但它仅适用于 bundle ,这些 bundle 可以作为插件项目导入 Eclipse 中。
- 那么,另一个聚合器模块能帮上忙吗?您可以设置多个聚合器,这些聚合器聚合另一个聚合器,这样您就不会得到一个列出所有内容的巨大聚合器模块?因为,您可能不想部署所有内容,您可以设置要从部署中排除的内容。快速谷歌搜索显示了如何做 it .
- @Neil Bartlett 已经指出,如果您正确设置了依赖项,bnd 将处理您的 list 。如果您需要对默认值进行额外调整,您可以随时设置 BND 指令文件。
您可以将第谷放在可能的工具列表中。它将帮助你进行依赖管理,因为你只需要在 list 中指定你的依赖关系,它会允许你使用 API 工具(但还没有集成)。但是,如果您想跳过一些令人头疼的问题(直到 Tycho 改进了对依赖 Maven Artifact 的支持),它会要求您使用 p2 存储库。
关于java - 从 maven 切换到 gradle 来管理一个 osgi 大项目(>200 包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6235795/