我想将我的项目打包在一个可执行的JAR中进行分发。
如何使Maven项目将所有依赖JAR打包到输出JAR中?
我想将我的项目打包在一个可执行的JAR中进行分发。
如何使Maven项目将所有依赖JAR打包到输出JAR中?
当前回答
对于任何想要从über JAR文件中排除特定依赖项的人来说,这是一个适合我的解决方案:
<project...>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>1.6.1</version>
<scope>provided</scope> <!-- <============= -->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>...</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
它不是mvn程序集插件的配置,而是依赖项的属性。
其他回答
将所有依赖项嵌入项目的JAR文件本身可能不是一个好主意。
我明白这一点(易于部署/使用),但这取决于您的项目的用例(可能还有其他选择(见下文))。
如果您完全独立使用,为什么不呢?
但是,如果您在其他上下文中使用项目(例如在web应用程序中,或放置在其他JAR所在的文件夹中),则类路径中可能有JAR副本(文件夹中的副本,JAR文件中的副本)。也许不是出价交易,但我通常避免这样做。
一个很好的选择:
将应用程序部署为ZIP或WAR文件:归档文件包含项目的JAR文件和所有依赖的JAR文件;使用动态类加载器机制(请参阅Spring Framework,或者您可以自己轻松完成)来拥有项目的单个入口点(要启动的单个类-请参阅另一个答案中的Manifest机制),它将(动态)向当前类路径添加所有其他需要的JAR文件。
像这样,最后只需要一个清单和一个“特殊的动态类加载器main”,您就可以开始您的项目:
java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
Use:
mvn clean install -U dependency:copy-dependencies
jar文件将在名为“target”的文件夹中生成,该文件夹与“src”文件夹位于同一根目录中。
我仔细阅读了这些响应中的每一个,希望创建一个包含所有依赖项的可执行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文件。
<build>
<plugins>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>WordListDriver</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
我尝试了多种解决方案,但这是一种在我们想要创建一个不可执行的胖JAR文件的场景中非常有效的解决方案,该文件包含外部系统的所有内部依赖项,而这些依赖项与之前无关。测试了生产场景。
将其包含在pom.xml文件中:
<?xml version="1.0" encoding="UTF-8"?>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
要运行以构建胖JAR文件的命令:
mvn assembly:assembly