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

时间:2009-06-18 22:25:47

标签: java maven-2 build-process build-automation

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

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

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

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

6 个答案:

答案 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是不言自明的。