【详解】使用maven插件maven-shade-plugin对可执行java工程及其全部依赖jar进行打包
使用maven-shade-plugin对可执行Java工程及其全部依赖JAR进行打包
在开发Java应用时,经常需要将项目及其所有依赖的库打包成一个单独的可执行JAR文件。这样做可以简化部署过程,避免因缺少依赖库而导致的问题。Maven是一个强大的项目管理和构建工具,它提供了多种插件来帮助开发者完成各种任务。maven-shade-plugin
就是其中一个非常有用的插件,它可以将项目的依赖库合并到最终的JAR文件中。
什么是maven-shade-plugin?
maven-shade-plugin
是Maven的一个插件,用于创建包含项目所有依赖的“uber-jar”(超级JAR)。这个插件通过将所有的类文件和资源文件合并到一个单一的JAR文件中,从而使得生成的JAR文件可以直接运行,而无需担心外部依赖的问题。
如何配置maven-shade-plugin
要在Maven项目中使用maven-shade-plugin
,首先需要在项目的pom.xml
文件中添加插件配置。下面是一个基本的配置示例:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
配置详解
- groupId 和 artifactId: 指定了插件的坐标。
- version: 插件的版本号。
- executions: 定义了插件的执行配置。
- phase: 指定插件绑定的生命周期阶段,在这里设置为
package
,意味着当Maven到达package
阶段时,会执行该插件。 - goals: 插件的目标,
shade
表示执行打包操作。 - configuration: 插件的具体配置选项。
- transformers: 转换器用于处理JAR中的元数据。
- ManifestResourceTransformer: 修改JAR的MANIFEST.MF文件,设置主类(即程序入口点)。
设置主类
在上述配置中,<mainClass>
标签指定了程序的入口类。你需要将其替换为你项目中的实际主类名称,例如com.example.MainClass
。这是非常重要的一步,因为没有指定主类的话,生成的JAR文件将无法直接运行。
打包并运行
完成上述配置后,可以通过以下命令来打包项目:
mvn clean package
这将触发Maven的package
生命周期阶段,并调用maven-shade-plugin
来创建包含所有依赖的JAR文件。生成的JAR文件通常位于项目的target
目录下。
要运行生成的JAR文件,可以使用以下命令:
java -jar target/your-project-name.jar
maven-shade-plugin
是一个非常有用的 Maven 插件,它可以将项目及其所有依赖项打包成一个单独的 JAR 文件,这样你就可以直接运行这个 JAR 文件而不需要担心依赖问题。
下面是一个具体的示例,展示如何在 pom.xml
中配置 maven-shade-plugin
来打包一个可执行的 Java 工程及其所有依赖项。
1. 创建一个简单的 Maven 项目
假设你已经创建了一个 Maven 项目,并且有一个主类 com.example.MainApp
,该类包含 public static void main(String[] args)
方法。
2. 配置 pom.xml
在 pom.xml
文件中,添加 maven-shade-plugin
的配置。以下是一个完整的 pom.xml
示例:
<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>example-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!-- 添加你的依赖项 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- 其他依赖项 -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.MainApp</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3. 编写主类 MainApp.java
确保你的主类 MainApp.java
包含 main
方法,例如:
package com.example;
public class MainApp {
public static void main(String[] args) {
System.out.println("Hello, World!");
// 你可以在这里调用其他依赖项的方法
}
}
4. 打包和运行
- 打包:在项目根目录下运行以下命令来生成包含所有依赖项的 JAR 文件:
mvn clean package
- 运行:生成的 JAR 文件位于
target
目录下,你可以使用以下命令来运行它:
java -jar target/example-app-1.0-SNAPSHOT.jar
5. 解释配置
-
<mainClass>
:指定主类,即包含 main
方法的类。 -
<transformers>
:用于处理资源文件,这里使用 ManifestResourceTransformer
来设置主类。 -
<phase>package</phase>
:指定在 package
阶段执行 shade
目标。
通过以上步骤,你就可以成功地使用 maven-shade-plugin
将你的 Java 应用程序及其所有依赖项打包成一个可执行的 JAR 文件。maven-shade-plugin
是 Maven 的一个插件,用于创建包含所有依赖项的“uber-jar”(或称为“fat jar”)。这种 JAR 文件包含了主类和所有依赖库,使得在没有外部依赖的情况下可以直接运行。这对于创建可执行的 Java 应用程序非常有用。
配置 maven-shade-plugin
要在你的 Maven 项目中配置 maven-shade-plugin
,你需要在项目的 pom.xml
文件中添加插件配置。以下是一个详细的示例:
<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>
<packaging>jar</packaging>
<name>My Application</name>
<url>http://example.com</url>
<dependencies>
<!-- 你的项目依赖项 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 其他依赖项 -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<!-- 添加主类信息 -->
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.MyApplication</mainClass>
</transformer>
<!-- 处理资源文件冲突 -->
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
<!-- 排除不需要的资源文件 -->
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
解释配置
-
<groupId>
, <artifactId>
, <version>
: 这些是项目的坐标,用于唯一标识项目。 -
<dependencies>
: 列出项目的所有依赖项。 -
<build>
: 定义构建过程。 -
<plugins>
: 插件配置部分。 -
<plugin>
: 指定 maven-shade-plugin
。 -
<version>
: 插件的版本号。 -
<executions>
: 插件的执行配置。 -
<phase>
: 插件绑定的生命周期阶段,这里绑定到 package
阶段。 -
<goals>
: 插件的目标,这里是 shade
。 <configuration>
: 插件的具体配置。
<transformers>
: 转换器用于处理资源文件。
-
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
: 用于设置 JAR 文件的主类。 -
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
: 用于合并资源文件,例如 Spring 的 spring.handlers
和 spring.schemas
。 -
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer">
: 用于处理 META-INF/services
目录下的服务提供者配置文件。
-
<filters>
: 用于排除不需要的资源文件,例如签名文件。
打包和运行
- 打包:
mvn clean package
这将生成一个包含所有依赖项的 JAR 文件,通常位于 target
目录下。
- 运行:
java -jar target/my-app-1.0-SNAPSHOT.jar
通过以上配置,你可以轻松地创建一个包含所有依赖项的可执行 JAR 文件,方便部署和运行。
- 点赞
- 收藏
- 关注作者
评论(0)