14

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

maven方式有几个问题:

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

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

3. 为了完成最终工件的打包和部署,我们还需要另一个子模块来导入部署所需的所有包(除了少数几个用于测试和模拟)。[已编辑] 请注意,此聚合与主 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 不是万能药,而是对当前情况的明确改进。

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

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

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

Buildr、Gradle 还是等待 Maven 3?

为 OSGi 包寻找一个好的开发环境

Maven:OSGI、包和多模块项目

但无论是在哪里不是关于 osgi 子模块或不是关于 gradle。

4

1 回答 1

2
  1. You can separate the parent and the aggregate maven modules, because currently your parent pom have two roles as you correctly observed. More information can be found in the Maven Introduction to POM.
  2. I'm afraid that bundles version management cannot be become easier unless you use API Tools. Perhaps it would be great if API tools can be integrated as Maven plugin, but I'm not aware of any work in this area. So, you either touch all versions at once or update them each time it is needed. API Tools will greatly help here, but it works only for bundles, which can be imported as Plug-in Projects inside Eclipse.
  3. 那么,另一个聚合器模块会在这里提供帮助吗?您可以设置多个聚合器,它们聚合另一个聚合器,这样您最终不会得到一个列出所有内容的巨大聚合器模块吗?因为,您可能不想部署所有内容,您可以设置要从部署中排除的内容。快速谷歌搜索显示了如何做到这一点
  4. @Neil Bartlett 已经指出,如果您正确设置了依赖项, bnd 将处理您的清单。如果您需要对默认值进行额外调整,您可以随时设置 BND 指令文件。

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

于 2011-06-05T08:21:43.847 回答