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

如何使Maven项目将所有依赖JAR打包到输出JAR中?


当前回答

我在这里尝试了投票最多的答案,并且能够运行JAR文件。但程序没有正确运行。我不知道是什么原因。当我尝试从Eclipse运行时,会得到不同的结果,但当我从命令行运行JAR文件时,会获得不同的结果(它会因程序特定的运行时错误而崩溃)。

我有一个与OP类似的需求,只是我的项目有太多(Maven)依赖项。幸运的是,唯一对我有效的解决方案是使用Eclipse。它非常简单和直接。这不是OP的解决方案,但对于有类似需求但有许多Maven依赖关系的人来说,这是一个解决方案,

只需右键单击项目文件夹(在Eclipse中)并选择Export然后选择Java→ 可运行JAR将要求您选择JAR文件的位置最后,选择具有要运行的Main方法的类,并选择带有JAR文件的*Package依赖项,然后单击Finish

其他回答

在我看来,Ken Liu是对的。Maven依赖插件允许您扩展所有依赖项,然后可以将其视为资源。这允许您将它们包含在主工件中。使用汇编插件会创建一个很难修改的辅助工件——在我的例子中,我想添加自定义清单条目。我的POM文件最终为:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>unpack-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>unpack-dependencies</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
    ...
    <resources>
      <resource>
        <directory>${basedir}/target/dependency</directory>
        <targetPath>/</targetPath>
      </resource>
    </resources>
  </build>
  ...
</project>

添加到文件pom.xml:

<dependency>
    <groupId>com.jolira</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <version>1.4.4</version>
</dependency>

And

<plugin>
    <groupId>com.jolira</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <version>1.4.4</version>
    <executions>
        <execution>
            <goals>
                <goal>one-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

接下来,mvn包还将另外创建一个胖JAR,包括所有依赖JAR文件。

我在这里尝试了投票最多的答案,并且能够运行JAR文件。但程序没有正确运行。我不知道是什么原因。当我尝试从Eclipse运行时,会得到不同的结果,但当我从命令行运行JAR文件时,会获得不同的结果(它会因程序特定的运行时错误而崩溃)。

我有一个与OP类似的需求,只是我的项目有太多(Maven)依赖项。幸运的是,唯一对我有效的解决方案是使用Eclipse。它非常简单和直接。这不是OP的解决方案,但对于有类似需求但有许多Maven依赖关系的人来说,这是一个解决方案,

只需右键单击项目文件夹(在Eclipse中)并选择Export然后选择Java→ 可运行JAR将要求您选择JAR文件的位置最后,选择具有要运行的Main方法的类,并选择带有JAR文件的*Package依赖项,然后单击Finish

我仔细阅读了这些响应中的每一个,希望创建一个包含所有依赖项的可执行JAR文件,但没有一个能正常工作。答案是shade插件,它非常简单明了。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>2.3</version>

  <executions>
    <!-- Run shade goal on package phase -->
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>

      <configuration>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>path.to.MainClass</mainClass>
          </transformer>
        </transformers>
      </configuration>
    </execution>
  </executions>

</plugin>

请注意,您的依赖项需要有编译或运行时的范围才能正常工作。

这个例子来自mkyong.com

要从命令行本身创建可执行JAR,只需从项目路径运行以下命令:

mvn assembly:assembly