java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Maven Shade Plugin 插件

Maven Shade Plugin 插件使用小结

作者:prcyang

本文详细解析maven-shade-plugin的用法,教你如何打包可执行jar包、排除不需要的依赖,以及通过class relocation解决包名冲突,具有一定的参考价值,感兴趣的可以了解一下

1 Maven Shade Plugin 地址

https://maven.apache.org/plugins/maven-shade-plugin/index.html

2 Maven Shade Plugin 特点

3 maven-shade-plugin 的用法

3.1 maven-shade-plugin 的基本用法

3.1.1 不配置 Main Class,打包成不可执行的jar包

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.6.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

不可执行的 JAR 文件主要用作 Java 类库(Library JAR),它不包含可以直接运行的主类。这样的 JAR 文件通常被引入到其他
Java 项目中作为依赖项使用

3.1.1 配置 Main Class,打包可执行的jar包

官方原文地址: https://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html

在configuration->transformers->transformer->mainClass 节点中设置主类,使生成的 JAR 文件可以直接通过 java -jar 命令运行,

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.6.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>org.sonatype.haven.HavenCli</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

可执行的 JAR 文件包含一个可以直接运行的 Java 应用程序。要使 JAR 文件可执行,它必须包含一个 Main-Class
属性,该属性指定要运行的主类(main class)

3.2 选择、排除依赖Jar包的文件

官网原文:https://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html
下面的 POM 代码片段展示了如何控制哪些项目依赖项应被包含/排除在超集 JAR 文件中:

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.6.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <artifactSet>
                <excludes>
                  <exclude>classworlds:classworlds</exclude>
                  <exclude>junit:junit</exclude>
                  <exclude>jmock:*</exclude>
                  <exclude>*:xml-apis</exclude>
                  <exclude>org.apache.maven:lib:tests</exclude>
                  <exclude>log4j:log4j:jar:</exclude>
                </excludes>
              </artifactSet>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

3.3 修改Class文件路径

使用 relocations 可以将某些类的路径修改,以防止不同依赖中的类冲突:
官网地址:https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.6.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <relocations>
                <relocation>
                  <pattern>org.codehaus.plexus.util</pattern>
                  <shadedPattern>org.shaded.plexus.util</shadedPattern>
                  <excludes>
                    <exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude>
                    <exclude>org.codehaus.plexus.util.xml.pull.*</exclude>
                  </excludes>
                </relocation>
              </relocations>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

这会指示插件将位于“org.codehaus.plexus.util”及其子包中的类移动到“org.shaded.plexus.util”这个包中。而类“Xpp3Dom”以及pull.*相关文件保留在其原始的包中。

还可以通过使用“include”标签来缩小该模式的范围:

<project>
  ...
                <relocation>
                  <pattern>org.codehaus.plexus.util</pattern>
                  <shadedPattern>org.shaded.plexus.util</shadedPattern>
                  <includes>
                    <include>org.codehaud.plexus.util.io.*</include>
                  </includes>
                </relocation>
  ...
</project>

4 maven-shade-plugin 会自动创建 dependency-reduced-pom.xml

在使用 Maven 的 maven-shade-plugin 插件时,确实会生成一个名为 dependency-reduced-pom.xml 的文件。这个文件是 Maven 项目的一个特殊版本,主要用于解决依赖冲突和简化最终的依赖结构。

4.1 为什么需要 dependency-reduced-pom.xml

依赖冲突解决:在大型项目中,可能会有多个库包含相同版本的依赖,但由于不同的作用域(compile, provided, runtime 等)或不同的版本,这些依赖可能会冲突。maven-shade-plugin 在创建 uber-jar 时,会尝试解决这些冲突,并生成一个简化后的 POM 文件,该文件只包含实际需要的依赖版本。

简化依赖结构:生成的 dependency-reduced-pom.xml 文件只包含最终项目中实际使用的依赖项和它们的版本,这对于确保构建的可重复性和清晰性非常有用。

4.1.1 生成

当你运行带有 maven-shade-plugin 的 Maven 构建时,插件会自动生成这个文件,在构建过程中,dependency-reduced-pom.xml 会被创建在 target/ 目录下。

4.1.2 使用

虽然通常不需要手动操作这个文件,但它对于理解项目的最终依赖结构非常有帮助。你可以在需要时查看这个文件来了解项目中实际包含哪些库和它们的版本。例如,如果你需要将项目部署到不支持完整 Maven 仓库的环境中,这个文件可以帮助你手动管理依赖。
注意事项

4.2 配置不生成

在 maven-shade-plugin所在的 标签下(或者 plugin-executions-execution 标签狭隘)添加

<configuration>
	<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>

到此这篇关于Maven Shade Plugin 插件使用小结的文章就介绍到这了,更多相关Maven Shade Plugin 插件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文