如何从单个Maven项目生成多个OSGi包?

时间:2014-03-30 20:12:10

标签: java maven osgi apache-felix

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

通常情况下,我只需将此模块拆分为更多Maven模块,以便通过Felix的maven-bundle-plugin创建捆绑包的生活更轻松。这里的问题是我仍然想为非OSGi用户创建一个核心JAR,他们不希望为了使用可选功能而必须包含几个额外的JAR(这要求他们在类路径上提供可选的依赖关系,因为它是)。不仅如此,我不希望将此模块拆分为更多模块,因为它使项目开发对开发人员来说更加繁琐,特别是当我们已经将代码拆分为适当的基于包的模块时原样。

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

使用Felix的maven-bundle-plugin有没有办法做到这一切?或者我是否必须使用程序集插件来复制可以从中生成包的模块的子集?或者我是否必须使用Ant脚本(或Maven插件)来执行此操作?我们尝试使用单独的Maven模块,只是将核心模块作为依赖项导入并从那里生成一个包,但无论导入/导出包设置和嵌入依赖项,结果包总是为空。

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

1 个答案:

答案 0 :(得分:2)

嗯,这就是我最终要做的事情。我正在使用maven-assembly-plugin复制我需要的二进制文件,并使用类似于Ant中的<fileSets/>元素的<fileset/>元素过滤掉我不希望包含的类。

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

这不是理想的,但它比为Maven项目编写Ant脚本更好!