我怎样才能创建一个可执行的JAR与依赖使用Maven?

我想将我的项目打包到单个可执行JAR中进行分发。

我怎样才能让Maven将所有依赖JAR包装到我的JAR中?


<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>fully.qualified.MainClass</mainClass>
          </manifest>
        </archive>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
    </plugin>
  </plugins>
</build>

和你一起运行它

mvn clean compile assembly:single

编译目标应该在汇编之前添加:单独或否则您自己的项目中的代码不包括在内。

在评论中看到更多细节。


通常这个目标与构建阶段相关联以自动执行。 这可确保在执行mvn install或执行部署/发布时构建JAR。

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>fully.qualified.MainClass</mainClass>
      </manifest>
    </archive>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
  </configuration>
  <executions>
    <execution>
      <id>make-assembly</id> <!-- this is used for inheritance merges -->
      <phase>package</phase> <!-- bind to the packaging phase -->
      <goals>
        <goal>single</goal>
      </goals>
    </execution>
  </executions>
</plugin>

您可以使用依赖项插件在包阶段之前在单独的目录中生成所有依赖项,然后将其包含在清单的类路径中:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>theMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

或者,使用${project.build.directory}/classes/lib作为OutputDirectory将所有jar文件集成到主jar中,但您需要添加自定义类加载代码来加载jar。


我博客了一些不同的方式来做到这一点。

请参阅使用Apache Maven的可执行文件jar(WordPress)

或可执行jar-with-maven-example(GitHub)

笔记

这些优点和缺点由Stephan提供。


对于手动部署

  • 优点
  • 缺点
  • 依赖关系不在最终的罐子里。
  • 将依赖关系复制到特定目录

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>copy-dependencies</id>
          <phase>prepare-package</phase>
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
            <outputDirectory>${project.build.directory}/${project.build.finalName}.lib</outputDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    使Jar可执行文件和类路径知道

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>${project.build.finalName}.lib/</classpathPrefix>
            <mainClass>${fully.qualified.main.class}</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
    

    在这一点上, jar实际上是用外部类路径元素执行的。

    $ java -jar target/${project.build.finalName}.jar
    

    制作可部署的档案

    jar文件只能在兄弟...lib/目录下执行。 我们需要将档案与目录及其内容进行部署。

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-antrun-plugin</artifactId>
      <executions>
        <execution>
          <id>antrun-archive</id>
          <phase>package</phase>
          <goals>
            <goal>run</goal>
          </goals>
          <configuration>
            <target>
              <property name="final.name" value="${project.build.directory}/${project.build.finalName}"/>
              <property name="archive.includes" value="${project.build.finalName}.${project.packaging} ${project.build.finalName}.lib/*"/>
              <property name="tar.destfile" value="${final.name}.tar"/>
              <zip basedir="${project.build.directory}" destfile="${final.name}.zip" includes="${archive.includes}" />
              <tar basedir="${project.build.directory}" destfile="${tar.destfile}" includes="${archive.includes}" />
              <gzip src="${tar.destfile}" destfile="${tar.destfile}.gz" />
              <bzip2 src="${tar.destfile}" destfile="${tar.destfile}.bz2" />
            </target>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    现在您的target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz) ,它们都包含jarlib/*


    Apache Maven Assembly插件

  • 优点
  • 缺点
  • 没有班级重定位支持(如果需要班级重定位,请使用maven-shade-plugin)。
  • <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <archive>
              <manifest>
                <mainClass>${fully.qualified.main.class}</mainClass>
              </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    您有target/${project.bulid.finalName}-jar-with-dependencies.jar


    Apache Maven Shade插件

  • 优点
  • 缺点
  • <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <shadedArtifactAttached>true</shadedArtifactAttached>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>${fully.qualified.main.class}</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    你有target/${project.build.finalName}-shaded.jar


    onejar - Maven的插件

  • 优点
  • 缺点
  • 自2012年以来没有积极支持。
  • <plugin>
      <!--groupId>org.dstovall</groupId--> <!-- not available on the central -->
      <groupId>com.jolira</groupId>
      <artifactId>onejar-maven-plugin</artifactId>
      <executions>
        <execution>
          <configuration>
            <mainClass>${fully.qualified.main.class}</mainClass>
            <attachToBuild>true</attachToBuild>
            <!-- https://code.google.com/p/onejar-maven-plugin/issues/detail?id=8 -->
            <!--classifier>onejar</classifier-->
            <filename>${project.build.finalName}-onejar.${project.packaging}</filename>
          </configuration>
          <goals>
            <goal>one-jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    

    Spring Boot Maven插件

  • 优点
  • 缺点
  • 添加潜在的不必要的Spring和Spring Boot相关的类。
  • <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
          <configuration>
            <classifier>spring-boot</classifier>
            <mainClass>${fully.qualified.main.class}</mainClass>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    你有target/${project.bulid.finalName}-spring-boot.jar

    链接地址: http://www.djcxy.com/p/773.html

    上一篇: How can I create an executable JAR with dependencies using Maven?

    下一篇: How do I fix android.os.NetworkOnMainThreadException?