【详解】使用maven插件maven-shade-plugin对可执行java工程及其全部依赖jar进行打包

举报
皮牙子抓饭 发表于 2025/09/27 21:09:13 2025/09/27
【摘要】 使用maven-shade-plugin对可执行Java工程及其全部依赖JAR进行打包在开发Java应用时,经常需要将项目及其所有依赖的库打包成一个单独的可执行JAR文件。这样做可以简化部署过程,避免因缺少依赖库而导致的问题。Maven是一个强大的项目管理和构建工具,它提供了多种插件来帮助开发者完成各种任务。​​maven-shade-plugin​​就是其中一个非常有用的插件,它可以将项目...

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

配置详解

  • groupIdartifactId: 指定了插件的坐标。
  • 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. 打包和运行

  1. 打包:在项目根目录下运行以下命令来生成包含所有依赖项的 JAR 文件:
mvn clean package
  1. 运行:生成的 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>

解释配置

  1. <groupId>​, ​<artifactId>​, ​<version>​: 这些是项目的坐标,用于唯一标识项目。
  2. <dependencies>​: 列出项目的所有依赖项。
  3. <build>​: 定义构建过程。
  4. <plugins>​: 插件配置部分。
  5. <plugin>​​: 指定 ​​maven-shade-plugin​​。
  6. <version>​: 插件的版本号。
  7. <executions>​: 插件的执行配置。
  8. <phase>​​: 插件绑定的生命周期阶段,这里绑定到 ​​package​​ 阶段。
  9. <goals>​​: 插件的目标,这里是 ​​shade​​。
  10. <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>​: 用于排除不需要的资源文件,例如签名文件。

打包和运行

  1. 打包:
mvn clean package

这将生成一个包含所有依赖项的 JAR 文件,通常位于 ​​target​​ 目录下。

  1. 运行:
java -jar target/my-app-1.0-SNAPSHOT.jar

通过以上配置,你可以轻松地创建一个包含所有依赖项的可执行 JAR 文件,方便部署和运行。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。