Java:如何构建基于Maven的项目的独立发行版?

我经常遇到使用Maven作为构建工具的Java应用程序或库的发行版。

遗憾的是,其中一些不提供独立(或可再分发)的jar子。

是否有可能以这种方式构建基于Maven的应用程序, 构建结果包含所有依赖项并且可以重新分发以便开箱即用?

我试着建立Jackrabbit的OCM模块。 出于一些非常“智能”的原因,没有可下载的独立版本。
所以我用Maven构建了Jackrabbit(Jackrabbit的源代码包包括OCM),并获得了与apache存储库中相同的jar。 jar 包含必要的依赖项,对我来说没用

使用Maven Shade插件

…但要小心陷阱(类似于我的答案中进一步描述的那个),这里有一个解决方法 。

另外,要小心使用Shade插件配置。 我偶然使用了双标签,并且变压器根本不适用,插件也冒昧地不警告我。

不要使用Maven Assembly插件

assembly:single将按原样解压缩依赖JAR,这可能不是你想要的。 例如, META-INF/spring.schemas类的东西将被最后一个被评估的Spring依赖JAR覆盖,因此你的XSD将无法找到(当然,除了最后一个JAR中的那些)。 这就是为什么像Alfresco这样的系统制作了他们的AMP插件,它将lib/内部的依赖关系捆绑在你正在构建的AMP中。 然而,后者引发了依赖管理问题。

你可能对appassembler插件有点运气。 如果做不到这一点,请看一下程序集插件 。 这更灵活,但水平更低。 如果你正在使用汇编插件,你可以在maven中找到它的章节:有用的权威指南 。

正如Dominic所说,使用汇编插件可以解决问题。 您通常会在自己项目的POM中配置它来收集和打包所有必需的依赖项:

  ...  maven-assembly-plugin   jar-with-dependencies    ... 

jar-with-dependencies由程序集插件预定义,并将包含最终包中的所有依赖项(请参阅此处的文档)。

如果您不想将Maven用于您自己的项目,则需要修改库的POM并自行重新打包(下载源代码,将上述代码段添加到pom.xml并运行mvn package )。 如果使用多个库,请注意重复或不兼容的传递依赖项。 在这种情况下, exclusions可能有所帮助(请参阅此处的文档)。

更改pom.xml文件并使用指令。 可以在此处找到类似的示例,以便您可以根据您的方案进行调整。

 *;scope=!test;inline=true 

我认为这应该可以解决问题。


以下是上述URL中的示例,它似乎给出了超时。

  4.0.0 br.gov.lexml toolkit bundle 3.0  lexml br.gov.lexml 1.0   Lexml_Toolkit-2.0   org.apache.maven.plugins maven-compiler-plugin  1.5 1.5    org.apache.felix maven-bundle-plugin true    *;-split-package:=merge-last br.gov.lexml.borda.Toolkit Toolkit  *;scope=!test;inline=true .,{maven-dependencies}        org.apache.xmlbeans xmlbeans 2.4.0   org.apache.xmlbeans xmlbeans-xmlpublic 2.4.0   log4j log4j 1.2.15   br.gov.lexmlbeans lexmlbeans 3.0    

我相信Maven Shade插件可以满足您的需求。 我在构建命令行界面工具时使用它来创建包含我的类的Uber JAR以及来自所有依赖项的类。

它非常容易使用,我认为这个例子是不言自明的。

正如一些海报所说,汇编插件是一个创建完整jar文件的好方法,具有所有项目依赖性。 但是,您实际上不必修改pom.xml文件。 只需运行:

 mvn assembly:single -DdescriptorId=jar-with-dependencies 

…为了创建一个jar文件。 如果你想做更高级的事情,你应该修改pom.xml,并创建一个自定义程序集描述符。