将 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 项目目录并根据 artifactId 和 version 中指定的 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 的常见问题和解决方案
- 如何指定 JAR 中的主类?
- 您可以使用指定主类 <mainClass> 内的标签 <manifest> Maven 插件配置部分。
- 如何从最终 JAR 中排除特定依赖项?
- 使用 excludes 插件配置中的标签来指定不应包含在最终 JAR 中的依赖项。
- 什么是 uber-JAR?
- uber-JAR 是一个 JAR 文件,它不仅包含已编译的代码,还包含其所有依赖项。
- 如何避免 JAR 中的类路径冲突?
- 这 maven-shade-plugin 允许您重命名依赖项中的包以避免冲突。
- 如何处理依赖项中的重复类?
- 配置 maven-shade-plugin 通过指定如何在最终 JAR 中处理重复的类和资源来管理重复的类和资源。
- 我可以仅包含依赖项中的特定文件吗?
- 是的,您可以配置 maven-assembly-plugin 或者 maven-shade-plugin 仅包含依赖项中的特定文件。
- 如何运行打包好的JAR?
- 使用 java -jar 命令后跟 JAR 文件的路径。
- 如何验证 JAR 文件的内容?
- 您可以使用 jar -tf 命令列出 JAR 文件的内容。
- 如果我的 JAR 文件太大怎么办?
- 使用 maven-shade-plugin 排除不必要的文件并最小化 JAR 大小。
关于 Maven 可执行 JAR 的总结性想法
使用 Maven 创建具有依赖项的可执行 JAR 可以简化 Java 应用程序的部署过程。通过正确配置 pom.xml 文件并利用 Maven Assembly Plugin 或 Maven Shade Plugin 等插件,开发人员可以将所有必要的依赖项打包到单个 JAR 文件中。这种方法确保应用程序可以在各种环境中无缝运行,使分发和执行变得简单。遵循这些步骤将帮助您有效管理项目的依赖项并创建可靠的可执行 JAR 文件。