我经常遇到Java应用程序或库的发行版 使用Maven作为他们的构建工具。
遗憾的是,其中一些不提供独立(或可再分发)的罐子。
是否有可能以这种方式构建基于Maven的应用程序 构建结果包含所有依赖项,并且可以重新分发以便开箱即用?
我试图构建Jackrabbit的OCM模块。
出于一些非常“智能”的原因,没有可下载的独立版本
版本。
所以我用Maven构建了Jackrabbit(Jackrabbit的源包包括
OCM),并获得与 apache repository 中相同的jar。
jar 不包含必要的依赖项,对我来说无用。
答案 0 :(得分:3)
正如Dominic所说,使用程序集插件可以解决问题。您通常会在自己项目的POM中配置它以收集和打包所有必需的依赖项:
...
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
...
jar-with-dependencies
由程序集插件预定义,并将包含最终包中的所有依赖项(请参阅文档here)。
如果您不想将Maven用于您自己的项目,则需要修改库的POM并自行重新打包(下载源代码,将上述代码段添加到pom.xml并运行mvn package
)。如果使用多个库,请注意重复或不兼容的传递依赖项。在这种情况下,exclusions
可能会有所帮助(请参阅文档here)。
答案 1 :(得分:3)
使用Maven Shade插件
...但要注意陷阱(类似于我的答案中进一步描述的那个),它已经a workaround explained here。
另外,要小心使用Shade插件配置。我偶然使用了一次双<configuration>
标签,变形金刚根本不适用,插件也冒昧地不警告我。
不要使用Maven Assembly插件
assembly:single
将按原样解压缩依赖JAR,这可能不是您想要的。例如。像META-INF/spring.schemas
这样的东西会被评估的最后一个Spring依赖JAR覆盖,因此你的XSD将无法找到(当然,除了最后一个JAR中的那些)。这就是为什么像Alfresco这样的系统制作了他们的AMP插件,它将lib/
内的依赖关系捆绑在你正在构建的AMP中。然而,后者引发了依赖管理问题。
答案 2 :(得分:2)
你可能会对appassembler plugin感到幸运。如果不这样做,请查看assembly plugin。这更灵活,但水平更低。如果您正在使用程序集插件,您可能会在maven: the definitive guide中找到有关它的章节。
答案 3 :(得分:1)
正如一些海报所说,汇编插件是一个创建完整jar文件的好方法,具有所有项目依赖性。但是,您实际上不必修改 pom.xml 文件。只需运行:
mvn assembly:single -DdescriptorId=jar-with-dependencies
...为了创建一个jar文件。如果你想做更高级的事情,你应该修改pom.xml,并创建一个自定义程序集描述符。
答案 4 :(得分:0)
更改pom.xml
文件并使用<Embed-Dependency>
指令。可以找到类似的示例here,以便您可以根据自己的情况进行调整。
<Embed-Dependency>*;scope=!test;inline=true</Embed-Dependency>
我认为这应该可以解决问题。
以上网址中的示例似乎给出了超时。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>br.gov.lexml</groupId>
<artifactId>toolkit</artifactId>
<packaging>bundle</packaging>
<version>3.0</version>
<parent>
<artifactId>lexml</artifactId>
<groupId>br.gov.lexml</groupId>
<version>1.0</version>
</parent>
<build>
<finalName>Lexml_Toolkit-2.0</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<!--_include>src/toolkit/resources/META-INF/MANIFEST.MF</_include-->
<Export-Package>*;-split-package:=merge-last</Export-Package>
<Bundle-Activator>br.gov.lexml.borda.Toolkit</Bundle-Activator>
<Bundle-Name>Toolkit</Bundle-Name>
<Private-Package />
<Embed-Dependency>*;scope=!test;inline=true</Embed-Dependency>
<Bundle-ClassPath>.,{maven-dependencies}</Bundle-ClassPath>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans-xmlpublic</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>
<dependency>
<groupId>br.gov.lexmlbeans</groupId>
<artifactId>lexmlbeans</artifactId>
<version>3.0</version>
</dependency>
</dependencies>
</project>
答案 5 :(得分:0)
我相信Maven Shade Plugin会满足您的需求。我在构建命令行界面工具时使用它来创建包含我的类的Uber JAR以及来自所有依赖项的类。
它非常易于使用,我认为这example是不言自明的。