如何使用Maven2将多个模块和第三方JAR捆绑在ZIP中?

时间:2009-07-27 09:48:37

标签: java maven-2

我正在使用Maven 2将我的应用程序开发为一组OSGi包。从其他OSGi包中使用了一些常用功能,例如日志记录,Web服务器等,例如,我使用的是JetG的OSGi版本

我想发送我的应用程序包含所有第三方包和一个OSGi容器。我选择了Apache Felix作为我的默认容器。

我对Maven很新,我不知道如何编写执行此操作的POM文件,但在Maven book中找不到相似的示例。核心观点似乎是多模块项目不会创建自己的工件。

它确实构建了我的bundle并将其打包成OSGI兼容的JAR文件(使用maven-bundle-plugin)。现在我想要它包装其他东西(不需要构建或任何东西,只需拉入并放入包中)并生成这样的ZIP文件:

+-Archive Root
 |
 +- /bundles
  |
  +- my.bundle1.jar
  +- my.bundle2.jar
  +- 3rd.party.bundle1.jar
  +- 3rd.party.bundle2.jar
 +- /conf
  |
  +- ... some config files ...
 +- felix.jar

这样,我的用户可以下载ZIP文件,将其解压缩到一个目录,说“MyApp”,然后去

# > java -jar /path/to/MyApp/felix.jar

关于细节的一些注释,如果它们重要:

  • 每个捆绑包都是一个共同父项目的子项,没有自己的源代码,packaging设置为“pom”,如本书的示例所示。
  • 我决定禁止将Felix嵌入到中心捆绑(“托管框架”方法)
  • 我可能会为运行OSGi容器的客户提供另一种包含我自己的捆绑包的运输。这可能是一个起点?

2 个答案:

答案 0 :(得分:2)

在您引用的文档中,有一个标题为嵌入依赖项的部分描述了插件如何解析Maven项目依赖项并将它们添加到类路径和资源中。

  

插件使用该指令将项目依赖项转换为和子句,然后将这些指令附加到当前指令集并传递给BND。如果您希望嵌入式依赖项位于开头或中间,或者您可以使用{maven-dependencies},它将自动扩展到相关子句。

     

...

     

插件使用该指令将项目依赖项转换为和子句,然后将这些指令附加到当前指令集并传递给BND。如果您希望嵌入式依赖项位于开头或中间,或者您可以使用{maven-dependencies},它将自动扩展到相关子句。

在下面的示例中,{maven-dependencies}占位符将被扩展为包含作为范围运行时的项目依赖项或编译为Include-Resource和Bundle-Classpath元素。

<!-- embed all compile and runtime scope dependencies -->
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>

<Include-Resource>
  {maven-resources},{maven-dependencies}
</Include-Resource>

<Bundle-ClassPath>.,{maven-dependencies},some.jar</Bundle-ClassPath>

通常,插件只检查直接依赖关系,但可以通过以下选项更改为包含完整的传递依赖关系集:

<Embed-Transitive>true</Embed-Transitive>

如果您想要内联依赖项而不是嵌入式,请添加inline = true。例如,内联所有编译和运行时范围的依赖项使用:

<Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>

答案 1 :(得分:2)

我花了一段时间(大约半天的文档阅读)才意识到我正在寻找的相当简单的答案是:

  

使用Maven Assemblies

它们实际上允许您将项目的工件和依赖项中的各种存档组合在一起。