使用 Maven 创建具有依赖关系的可执行 JAR

使用 Maven 创建具有依赖关系的可执行 JAR
使用 Maven 创建具有依赖关系的可执行 JAR

将 Maven 项目打包到单个可执行 JAR 中

在处理 Java 项目时,通常需要将应用程序打包到单个可执行 JAR 文件中以便于分发。 Maven 是一个强大的构建自动化工具,允许开发人员在这个单一输出 JAR 中包含所有必要的依赖项。

本文将指导您完成配置 Maven 项目所需的步骤,以将所有依赖项 JAR 包含到最终的可执行 JAR 中。通过遵循这些说明,您将简化部署过程并确保您的应用程序在不同环境中顺利运行。

命令 描述
<plugin> 定义在构建过程中使用的 Maven 插件。插件可以执行特定的任务,例如编译代码或打包项目。
<groupId> 指定Maven项目的组标识符,通常是反向域名。
<artifactId> 定义工件的标识符,即项目的名称。
<version> 指示项目的当前版本。
<build> 包含项目的构建配置,包括插件和资源。
<descriptorRef> 引用 Maven 程序集插件要使用的预定义描述符,例如“jar-with-dependencies”。
<mainClass> 指定JAR文件运行时要执行的主类。
<execution> 定义插件内的执行块,指定要在不同构建阶段执行的任务。
mvn clean package 命令清理项目并将其打包到 JAR 文件中,包括所有依赖项。
java -jar target/...jar 用于运行生成的 JAR 文件的命令,指定 JAR 的路径。

使用 Maven 创建并运行可执行 JAR

上面提供的脚本演示了如何配置 Maven 项目以将其所有依赖项打包到单个可执行 JAR 文件中。第一个脚本是 Maven pom.xml 文件,其中包含项目的配置。在此文件中, <plugin> 标签用于定义 Maven Assembly Plugin。该插件对于创建包含所有依赖项的可执行 JAR 至关重要。这 <descriptorRefs> 插件配置中的标签指定了 jar-with-dependencies 描述符,确保项目的所有依赖项都打包到最终的 JAR 文件中。这 <mainClass> 标签里面的 <manifest> 部分至关重要,因为它告诉 Maven 执行 JAR 时哪个类包含要运行的 main 方法。

<execution> 插件配置内的块是操作发生的地方。它指定插件的目标 single 应在期间执行 package 构建生命周期的阶段。这就是触发创建具有依赖项的 JAR 文件的原因。第二个脚本是一个简单的命令行指令: mvn clean package。此命令清理项目(删除以前的构建工件)、编译源代码、运行测试并将项目打包到 JAR 文件中。最终的 JAR 文件将位于 target 项目目录并根据 artifactIdversion 中指定的 pom.xml

使用 Maven 创建具有依赖关系的可执行 JAR 文件

Maven 配置脚本

<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.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.example.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>

运行Maven命令打包JAR

命令行说明

mvn clean package
# This command will compile the code, run the tests, and create the JAR file
# The JAR file will include all dependencies specified in the pom.xml
# It will be located in the target directory of the project
# The final JAR file will be named my-app-1.0-SNAPSHOT-jar-with-dependencies.jar

# To run the JAR file, use the following command:
java -jar target/my-app-1.0-SNAPSHOT-jar-with-dependencies.jar
# Ensure that the mainClass specified in the pom.xml is correct
# This will start your application with all dependencies included

打包依赖项的高级 Maven 技术

除了使用 Maven 创建可执行 JAR 的基本配置之外,还有其他技术可以增强您的构建过程。其中一项技术涉及使用 shade 插件而不是 assembly 插入。 Maven Shade 插件提供了用于创建 uber-JAR(包含依赖项的 JAR)的更高级功能。它允许您重命名包以避免类路径冲突,并为重复的类和资源提供更好的处理。此外,它还提供对最终 JAR 中包含哪些依赖项的细粒度控制。

另一个重要方面是管理 JAR 文件的大小。大型 JAR 文件可能很麻烦,传输或加载速度也很慢。这 maven-shade-plugin 可以帮助您排除不必要的文件和类,从而减少最终 JAR 的大小。您还可以配置插件,通过删除非必要信息(例如未使用的类或冗余资源)来最小化 JAR。在处理具有大量依赖项的大型项目时,这些高级配置特别有用。

Maven 可执行 JAR 的常见问题和解决方案

  1. 如何指定 JAR 中的主类?
  2. 您可以使用指定主类 <mainClass> 内的标签 <manifest> Maven 插件配置部分。
  3. 如何从最终 JAR 中排除特定依赖项?
  4. 使用 excludes 插件配置中的标签来指定不应包含在最终 JAR 中的依赖项。
  5. 什么是 uber-JAR?
  6. uber-JAR 是一个 JAR 文件,它不仅包含已编译的代码,还包含其所有依赖项。
  7. 如何避免 JAR 中的类路径冲突?
  8. maven-shade-plugin 允许您重命名依赖项中的包以避免冲突。
  9. 如何处理依赖项中的重复类?
  10. 配置 maven-shade-plugin 通过指定如何在最终 JAR 中处理重复的类和资源来管理重复的类和资源。
  11. 我可以仅包含依赖项中的特定文件吗?
  12. 是的,您可以配置 maven-assembly-plugin 或者 maven-shade-plugin 仅包含依赖项中的特定文件。
  13. 如何运行打包好的JAR?
  14. 使用 java -jar 命令后跟 JAR 文件的路径。
  15. 如何验证 JAR 文件的内容?
  16. 您可以使用 jar -tf 命令列出 JAR 文件的内容。
  17. 如果我的 JAR 文件太大怎么办?
  18. 使用 maven-shade-plugin 排除不必要的文件并最小化 JAR 大小。

关于 Maven 可执行 JAR 的总结性想法

使用 Maven 创建具有依赖项的可执行 JAR 可以简化 Java 应用程序的部署过程。通过正确配置 pom.xml 文件并利用 Maven Assembly Plugin 或 Maven Shade Plugin 等插件,开发人员可以将所有必要的依赖项打包到单个 JAR 文件中。这种方法确保应用程序可以在各种环境中无缝运行,使分发和执行变得简单。遵循这些步骤将帮助您有效管理项目的依赖项并创建可靠的可执行 JAR 文件。