用Maven构建Fat JAR

时间:2020-01-09 10:36:50  来源:igfitidea点击:

Maven可以从Java项目构建一个Fat JAR。 Fat JAR是一个单个JAR文件,其中包含项目中所有已编译的Java类以及项目所依赖的所有JAR文件中的所有已编译Java类(请参阅Maven依赖关系)。在这个Maven Fat JAR教程中,我将向我们展示如何使用Maven创建Fat JAR。

当我们需要构建可执行的JAR文件时,胖JAR会很方便。微服务可执行文件。我们可以将微服务及其所有依赖项打包到一个JAR文件中。这使执行变得更加容易,因为我们不必在类路径中列出微服务所依赖的所有JAR文件。这简化了启动微服务的命令。

如果我们需要将应用程序打包在Docker容器中,则Fat JAR也很方便。无需将应用程序依赖的每个JAR文件添加到Docker容器,只需添加我们应用程序的Fat JAR。同样,它更短,更容易,并且使Dockerfile与应用程序使用的外部依赖项(JAR文件)无关。

Fat JAR POM配置

为了使Maven从项目中构建Fat JAR,必须在项目的POM文件中包含Fat JAR构建配置。通过将maven-assembly-plugin包含在POM文件的plugin部分中,可以配置Maven从项目中构建Fat JAR。 Maven是指将其作为程序集构建的输出产品。因此,名称为maven-assembly-plugin。这是一个来自POM文件的示例片段,显示了maven-assembly-plugin配置的一个示例:

<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>

" maven-assembly-plugin"配置内的" configuration" XML元素包含" descriptorRef",它告诉Maven该配置应构建哪种类型的程序集。值jar-with-dependencies告诉Maven构建具有依赖关系的JAR文件,这是Fat JAR的另一个术语。

" executions" XML元素告诉Maven该Maven插件应该在哪个Maven构建阶段和目标中执行。 " maven-assembly-plugin"应始终在" package"阶段执行。

Maven命令来构建Fat JAR

使Maven为项目构建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元素。

我们可以在我的《 Maven命令》教程中阅读有关Maven命令的更多信息。

我们可以在Maven官方插件文档中阅读有关Maven插件的更多信息。

带有Fat JAR配置的完整POM文件

这是带有Fat JAR配置的完整Maven POM文件,只是向我们展示了这种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.Hyman.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>