2014-03-30 57 views
1

基本问题是这样的:我有一个项目已经为各种子项目使用了多个Maven模块。但是,其中一个模块(核心模块)在创建时可以自行拆分为多个OSGi包。这是由于核心模块包含几个可选的依赖关系,每个依赖关系在需要的地方都有独立的Java包。例如,对JSON输入文件的支持是可选的,因为它们需要Jackson的可选依赖项。依赖于Jackson依赖的类都被隔离到模块内的某些json包。因此,从理论上讲,我可以从核心创建一个最小包,它不包含依赖可选依赖项的包。如何从单个Maven项目生成多个OSGi包?

通常情况下,我会简单地将此模块分解为更多的Maven模块,以便通过Felix的maven-bundle-plugin轻松创建包。这里的问题是,我仍然想为非OSGi用户创建一个核心JAR,这些用户不想为了使用可选功能而需要包含几个额外的JAR(这要求他们提供类路径上的可选依赖项,因为它是)。不仅如此,我也不希望将这个模块分解成更多的模块,因为它使开发人员对项目的开发更加乏味,特别是当我们已经将代码分解到适当的基于软件包的模块时就这样。

我们试图使用OSGi的方式是让API模块成为一个片段主机(为了允许它在不需要OSGi支持的情况下加载提供者包),然后让其他包使用所述片段主机。对于核心外的较小模块,这看起来效果很好,但对于核心,我们希望能够从单个模块提供多个bundle,以便bundle中不需要可选依赖项。就现在而言,对于插件,我们已经有了一个机制来扫描它们,并忽略没有所有必需的类来加载它们的插件(例如,如果插件需要JPA提供程序但JPA API不可用,那个插件未加载)。一旦我们可以成功地将核心模块拆分为多个bundle,我可以在OSGi环境中使用声明式服务作为插件方法(而不是用于普通Java环境的默认类路径JAR扫描机制),所以这不是问题。

有什么办法可以使用Felix的maven-bundle-plugin来完成所有这些工作吗?或者我将不得不使用程序集插件来复制可以生成包的模块的子集?或者我将不得不求助于编写Ant脚本(或Maven插件)来执行此操作?我们已经尝试过使用单独的Maven模块,它们只是将核心模块作为依赖项导入并从那里生成一个包,但不管导入/导出包的设置和嵌入依赖关系如何,结果包总是空的。

或者,有没有更好的方法来做到这一点?我们已经将<optional>true</optional>配置用于可选的依赖关系,但Felix插件似乎并不关心这一点,并且无需使用可选属性就可以导入所有这些依赖关系。

+0

实际上,您无法使用Maven为每个项目构建多个工件。这不仅仅是Maven的工作方式,而且你会以整体的方式对抗它。另外,您使用可选软件包导入的方式听起来很奇怪且不必要;你可能想更详细地描述这个动机,以便找到更好的解决方案。 –

+0

可选的依赖关系用于在启动时按需加载的某些插件。如果插件缺少依赖关系,则该插件不会添加到可用插件列表中。如果它有帮助,那么这个项目就是Log4j版本2。 – Matt

回答

2

嗯,这就是我最终要做的。我使用maven-assembly-plugin来复制我需要的二进制文件,并使用类似于<fileset/>元素的<fileSets/>元素过滤出我不想包含的类。

为每个程序集使用生成的目录,我使用maven-bundle-plugin以及<buildDirectory/>配置选项来指定程序包的类文件所在的位置。

这并不理想,但它比为Maven项目编写Ant脚本要好!

相关问题