Maven可以将你的Java项目构建成一个Fat JAR。 Fat JAR是一个单个JAR文件,其中包含项目中所有已编译的Java类以及项目所依赖的所有JAR文件。
当你需要构建可执行的JAR文件时,Fat JAR会很方便。如:微服务。你可以将你的微服务及其所有依赖项打包到一个JAR文件中。这使执行变得更加容易,因为你不必在类路径中列出微服务所依赖的所有JAR文件,这简化了启动微服务的命令。
如果你需要将应用程序打包在Docker容器中,Fat JAR也很方便。无需将应用程序依赖的每个JAR文件添加到Docker容器,只需添加应用程序的Fat JAR,并且使Dockerfile与应用程序使用的外部依赖项(JAR文件)无关。
1.Fat JAR POM配置
为了使用Maven从项目中构建Fat JAR,必须在项目的POM文件中包含Fat JAR构建配置。
通过将maven-assembly-plugin包含在POM文件的plugin部分中,可以配置Maven从项目中构建Fat JAR。
<build> <finalName>my-project-name</finalName> <plugins> <!-- other Maven plugins ... --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.1</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
configuration XML元素内的maven-assembly-plugin包含一个descriptorRef,它告诉Maven应构建哪种类型的程序集。 jar-with-dependencies值告诉Maven构建具有依赖关系的JAR文件,这其实是Fat JAR的另一个术语。
executions XML元素告诉Maven该Maven插件应在哪个阶段和目标期间执行。 这个maven-assembly-plugin指定在打包阶段执行。
2.使用Maven命令来构建Fat JAR
构建Fat JAR的Maven命令:
mvn clean package
当使用前面显示的maven-assembly-plugin配置执行Maven package阶段时,Maven将在target目录中输出Fat JAR,Maven将其所有其他构建(例如,编译的类,生成的JavaDocs等)都输出到该目录中。 Fat JAR的命名如下:
my-project-name-jar-with-dependencies.jar
上述Fat JAR文件名中my-project-name是示例中的build XML元素中最上面finalName XML元素的值。
其它选择参考文档: http://maven.apache.org/plugins/maven-assembly-plugin/
3.完整POM文件Fat JAR配置
这是Fat JAR配置的完整Maven POM文件:
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jenkov.myprojectname</groupId> <artifactId>my-project-name</artifactId> <version>1.1.0</version> <packaging>jar</packaging> <name>My Project Name</name> <dependencies> <!-- Dependencies used by project --> </dependencies> <build> <finalName>my-project-name</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.1</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>