[Maven]maven-shade-plugin使用指南

翻译 2017年08月29日 09:54:27

1. Selecting Contents for Uber JAR

下面的POM代码段显示了如何控制在uber JAR中应该包含/排除哪些项目依赖关系:

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

当然,也可以使用<includes>来指定组件的白名单。组件形式由groupId:artifactId[[:type]:classifier]的复合标识符表示。从插件1.3版本开始,通配符'*'和'?'可以用来做全局模式匹配。对于包含所选依赖关系的那些类的细粒度控制,可以使用组件过滤器:

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

这里,类似Ant的模式用于指定依赖关系junit:junit中只有某些类/资源应该包含在uber JAR中。第二个过滤器演示了插件1.3版中引入的组件身份(artifact identity)通配符的使用。它从每个组件排除所有与签名相关的文件,而不管其组是什么或工件ID是什么。

除了用户指定的过滤器之外,插件还可以配置为自动删除项目未使用的所有依赖关系类,从而最大限度地减少所产生的JAR:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <minimizeJar>true</minimizeJar>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

从版本1.6开始,minimizeJar将respect由过滤器中include标记的类。 请注意,为组件中的类显示指定include过滤器会隐式排除该组件中的其他所有非指定类:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <minimizeJar>true</minimizeJar>
              <filters>
                <filter>
                   <artifact>log4j:log4j</artifact>
                   <includes>
                       <include>**</include>
                   </includes>
                </filter>
                <filter>
                   <artifact>commons-logging:commons-logging</artifact>
                   <includes>
                       <include>**</include>
                   </includes>
                </filter>
              </filters>            
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

2. 重定位类 Relocating Classes

如果uber JAR被重用为某个其他项目的依赖,如果直接包含所有来自uber JAR中组件的依赖可能会导致类加载冲突,这是由于在classpath上有重复类。为了解决这个问题,可以重新定位包含在阴影组件(shaded artifact)中的类,以创建其字节码的私有副本:

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

这指示插件通过移动相应的JAR文件条目并重写受影响的字节码( JAR file entries and rewritting the affected bytecode),将org.codehaus.plexus.util包以及子包中的类从组件org.shaded.plexus.util中移到org.shaded.plexus.util包中。Xpp3Dom类和pull其他类将保留在原始包中。

3. Attaching the Shaded Artifact

默认情况下,插件将用阴影组件替换项目的主要组件。如果原始和阴影的组件都应该安装/部署到存储库中,那么可以配置插件使阴影工件附加为辅助工件:

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

通过附加的分类器将阴影组件与主要组件区分开来。

原文:http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

http://maven.apache.org/plugins/maven-shade-plugin/examples/attached-artifact.html

PAT乙级 1062. 最简分数(20)--简单易错注意细节

题目链接:https://www.patest.cn/contests/pat-b-practise/1062 1062. 最简分数(20) 时间限制 400 m...

算法学习之递归--爬楼梯问题

例题: 爬楼梯 树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。 例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二...

使用maven shade plugin打包uber jar包

最近项目需要,在使用spark编写Java应用时,最终编写的程序必须打包成一个jar包才能提交到spark集群运行。由于spark是一个分布式系统,提交的程序最终将分散到许多节点上运行,如果程序依赖其...

使用maven-shade-plugin插件解决spark依赖冲突问题

依赖冲突:NoSuchMethodError,ClassNotFoundException      当用户应用于Spark本身依赖同一个库时可能会发生依赖冲突,导致程序奔溃。依赖冲突表现为在运行中出...

maven-shade-plugin 使用maven插件对java工程进行打包

现在基本上都是采用maven来进行开发管理,我有一个需求是需要把通过maven管理的java工程打成可执行的jar包,这样也就是说必需把工程依赖的jar包也一起打包。而使用maven默认的packag...

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

作者:chenzhou123520 出处:http://chenzhou123520.iteye.com/blog/1706242 使用 maven 插件 maven-shade-pl...

Java之——使用 maven 插件 maven-shade-plugin 对可执行 java 工程及其全部依赖 jar 进行打包

现在基本上都是采用maven来进行开发管理,我有一个需求是需要把通过maven管理的java工程打成可执行的jar包,这样也就是说必需把工程依赖的jar包也一起打包。而使用maven默认的packag...

maven-shade-plugin打包无法加载spring问题

spark工程集成spirng,在main方法中加载spring public static void main(String[] args) { SpringContainer.get...

通过maven-shade-plugin 解决Elasticsearch与hbase的jar包冲突问题

今天在项目中集成hbase1.0.0-cdh5.5.2和ElasticSearch2.2.0时出现了问题,原先在集成hbase时,引入了架包com.google.guava(16.0版本),后来在集成...

通过maven-shade-plugin插件打可以独立运行的jar包

通过maven-shade-plugin插件打可以独立运行的jar包
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Maven]maven-shade-plugin使用指南
举报原因:
原因补充:

(最多只允许输入30个字)