什么是在Maven捆绑整个项目的最佳方式?

时间:2016-04-08 20:52:59

标签: java eclipse maven

我想创建一个可自动执行的胖子(Shade插件),但也包含源代码,资源,测试以及可导入Eclipse的所有内容。

jar将是单文件可执行应用程序,它还以可导入的方式包含整个项目作为maven项目(在解压缩jar之后,我假设)。

另一个选项是生成的项目zip,其中包括基本级别的二进制分发。

有这样的事吗?

3 个答案:

答案 0 :(得分:2)

可能的解决方案需要3个步骤:

  1. 使用maven-shade-plugin创建项目的超级jar。此JAR将包含所有依赖项,并且可执行。
  2. 使用maven-assembly-plugin创建由项目源组成的副工件。此ZIP将包含pom.xml以及src下的所有来源。
  3. 创建另一个侧面artitact,它将有效地成为我们的最终工件,它将包含解压缩的着色JAR(使其有效可执行)和源ZIP。
  4. 这可能是一种配置:

    <plugin>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
            <execution>
                <id>make-uberjar</id>
                <goals>
                    <goal>shade</goal>
                </goals>
                <phase>package</phase>
                <configuration>
                    <transformers>
                        <transformer
                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>fully.classified.name.to.main.Class</mainClass>
                        </transformer>
                    </transformers>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.6</version>
        <executions>
            <execution>
                <id>sources</id>
                <goals>
                    <goal>single</goal>
                </goals>
                <phase>package</phase>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/assembly-sources.xml</descriptor>
                    </descriptors>
                </configuration>
            </execution>
            <execution>
                <id>final</id>
                <goals>
                    <goal>single</goal>
                </goals>
                <phase>package</phase>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    这会配置maven-shade-plugin的执行和maven-assembly-plugin的执行。第一次执行将创建源ZIP。这将是assembly-sources.xml程序集描述符文件:

    <assembly
        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
        <id>sources</id>
        <formats>
            <format>zip</format>
        </formats>
        <includeBaseDirectory>false</includeBaseDirectory>
        <fileSets>
            <fileSet>
                <directory>${project.basedir}</directory>
                <includes>
                    <include>pom.xml</include>
                    <include>src/**</include>
                </includes>
            </fileSet>
        </fileSets>
    </assembly>
    

    它将pom.xmlsrc下的所有内容都包含在具有sources分类器的ZIP中。

    第二个assembly.xml程序集描述符文件将是:

    <assembly
        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
        <id>jar-with-sources</id>
        <formats>
            <format>jar</format>
        </formats>
        <includeBaseDirectory>false</includeBaseDirectory>
        <dependencySets>
            <dependencySet>
                <includes>
                    <include>${project.groupId}:${project.artifactId}:jar:${project.version}</include>
                </includes>
                <unpack>true</unpack>
            </dependencySet>
            <dependencySet>
                <useProjectAttachments>true</useProjectAttachments>
                <includes>
                    <include>${project.groupId}:${project.artifactId}:zip:sources:${project.version}</include>
                </includes>
            </dependencySet>
        </dependencySets>
    </assembly>
    

    这会创建2 <dependencySet>。第一个解包了着色的JAR(它替换了构建中该点的主要工件)。第二个只包含sources ZIP附加工件;请注意,我们需要使用<useProjectAttachments>来包含附加的来源ZIP。

    当您运行mvn clean install时,您将获得一个文件{finalName}-jar-with-sources.jar,它将成为您想要的可执行JAR。它还将包含根文件夹中所有源的ZIP文件。

答案 1 :(得分:0)

我发现使用maven assembly-plugin可以让你最好地控制这些东西,无论是超级罐还是可安装的拉链。 shade插件适用于超级罐,但对于安装程序拉链或安装程序则不太好。 在过去,我还通过添加izpack插件来增强该功能,izpack插件创建了一个真正的安装程序,而不是使用程序集插件创建的可分发zip。

例如,使用assembly-plugin,您可以选择包含或排除某些文件资源。例如,当您想在使用IDE时使用配置文件时,会发生这种情况,但您确实希望在最终分发zip中将其排除,或者您希望包含稍微不同的文件。 当你想要生成一个rpm时也会发生同样的情况:汇编插件可以帮助你做好准备,以便首先准备rpm插件运行所需的内容。

程序集插件附带了各种设置,您可以在其xml配置文件中声明这些设置,并且已有详细记录。

答案 2 :(得分:0)

在大多数情况下,尝试将所有应用程序依赖项打包在一个 .jar 中是一个坏主意,主要是因为 .jars 不是设计为以这种方式使用的。事实上,它们可能包含 META-INF/ 和其他可能相互冲突的特定于 jar 的文件。

当我必须构建可以从命令行运行的二进制发行版时,我使用 Assembly 插件,如 I've described in this post。如果您需要分发 GUI 应用程序或一键式、自包含的 Web 服务器,方法将非常相似。