maven-shade-plugin 入门指南

作者: data4 | 来源:发表于2016-11-22 17:54 被阅读22043次

    1. Why?

    通过 maven-shade-plugin 生成一个 uber-jar,它包含所有的依赖 jar 包。

    2. Goals

    Goal Description
    shade:help Display help information on maven-shade-plugin.Callmvn shade:help -Ddetail=true -Dgoal=<goal-name>to display parameter details.
    shade:shade Mojo that performs shading delegating to the Shader component.

    3. Usage

    • 配置 maven-shade-plugin

    maven-shade-plugin 将 goal shade:shade 绑定到 phase package 上。

     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
                 <version>2.4.3</version>
                 <configuration>
                    <!-- put your configurations here -->
                 </configuration>
                 <executions>
                     <execution>
                         <phase>package</phase>
                         <goals>
                            <goal>shade</goal>
                         </goals>
                     </execution>
                 </executions>
             </plugin>
         </plugins>
     </build>
    
    • 执行命令
    mvn clean package
    

    会在 target 文件生成一个 uber-jar,以 -shaded.jar 为后缀的 jar 包。

    4. Examples

    • Selecting Contents for Uber JAR

    将该工程依赖的部分 Jar 包 include/exclude 掉。

    <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</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>
    

    将依赖的某个 Jar 包内部的类或者资源 include/exclude 掉。

    <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
                <configuration>
                  <filters>
                    <filter>
                      <artifact>junit:junit</artifact>
                      <includes>
                        <include>junit/framework/**</include>
                        <include>org/junit/**</include>
                      </includes>
                      <excludes>
                        <exclude>org/junit/experimental/**</exclude>
                        <exclude>org/junit/runners/**</exclude>
                      </excludes>
                    </filter>
                    <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>
    

    maven-shade-plugin 自动将所有不使用的类全部排除掉,将 uber-jar 最小化。

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
                <configuration>
                  <minimizeJar>true</minimizeJar>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    
    • Attaching the Shaded Artifact

    默认会生成一个Jar包和一个以 "-shaded"为结尾的uber-jar包,可以通过配置来指定uber-jar的后缀名。

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
                <configuration>
                  <shadedArtifactAttached>true</shadedArtifactAttached>
                  <shadedClassifierName>jackofall</shadedClassifierName> <!-- Any name that makes sense -->
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    
    • Executable JAR

    通过设置 MainClass 创建一个可执行 Jar 包。

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</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>
    
    • Relocating Classes

    Java 工程经常会遇到第三方 Jar 包冲突,使用 maven shade plugin 解决 jar 或类的多版本冲突。 maven-shade-plugin 在打包时,可以将项目中依赖的 jar 包中的一些类文件打包到项目构建生成的 jar 包中,在打包的时候把类重命名。下面的配置将 org.codehaus.plexus.util jar 包重命名为 org.shaded.plexus.util。

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</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>
    

    参考

    maven 入门指南
    maven 生命周期
    Maven 默认插件以及功能
    maven 依赖管理
    maven-shade-plugin 入门指南
    maven-assembly-plugin 入门指南

    相关文章

      网友评论

      • 803284b34c18:不错不错,收藏了。

        推荐下,分布式作业中间件 Elastic-Job 源码解析 16 篇:http://t.cn/R05mBNd


        12a033ef755a:写的不错,谢谢博主;已收藏~
      • 2a0f88c9ef43:你好,想请问一下这种情况如何处理呢:
        spring-context.jar 和 spring-jms.jar 有两个相同的spring.schemas文件名,但是里面有不同的内容,可以让插件自动将这个文件合并后打包吗?
        食尘者:````<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <executions>
        <execution>
        <phase>package</phase>
        <goals>
        <goal>shade</goal>
        </goals>
        <configuration>
        <createDependencyReducedPom>false</createDependencyReducedPom>
        <transformers>
        <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>
        </transformers>
        </configuration>
        </execution>
        </executions>
        </plugin>`````
      • data4:一篇介绍 maven-shade-plugin的文章

      本文标题:maven-shade-plugin 入门指南

      本文链接:https://www.haomeiwen.com/subject/mpbhpttx.html