【问题标题】:How can I generate multiple OSGi bundles from a single Maven project?如何从单个 Maven 项目生成多个 OSGi 包?
【发布时间】:2014-05-10 01:30:35
【问题描述】:

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

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

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

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

或者,有没有更好的方法来做到这一点?我们已经为可选依赖项使用了 <optional>true</optional> 配置,但 Felix 插件似乎并不关心这一点,并且无论如何都在不使用可选属性的情况下导入所有这些依赖项。

【问题讨论】:

  • 你真的不能使用 Maven 为每个项目构建多个工件。这不是 Maven 的工作方式,您将一直与它作斗争。此外,您使用可选包导入的方式听起来很奇怪且不必要;您可能需要更详细地描述这样做的动机,以便找到更好的解决方案。
  • 可选依赖项用于某些在启动时按需加载的插件。如果插件缺少依赖项,则该插件不会添加到可用插件列表中。如果有帮助,有问题的项目是 Log4j 版本 2。

标签: java maven osgi apache-felix


【解决方案1】:

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

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

虽然不理想,但比为 Maven 项目编写 Ant 脚本要好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2011-10-06
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多