关闭

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

标签: mavenmaven-shade-plugin
556人阅读 评论(0) 收藏 举报
分类:

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

0
0
查看评论

Apache maven shade plugin使用说明

introductionApache maven shade plugin提供把工程的artifact及其依赖打包到一个uber-jar中并能隐藏起来(比如重命名),shade插件仅仅有一个功能就是创建一个shaded包。 那什么是uber-jar呢,uber在德语中是above或over的意思,...
  • qq_35799003
  • qq_35799003
  • 2017-04-18 11:41
  • 1702

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

依赖冲突:NoSuchMethodError,ClassNotFoundException      当用户应用于Spark本身依赖同一个库时可能会发生依赖冲突,导致程序奔溃。依赖冲突表现为在运行中出现NoSuchMethodError或者Class...
  • qq_25827845
  • qq_25827845
  • 2017-02-10 18:39
  • 4434

maven-shade-plugin将所有依赖项打包,及打包后未找到主程序入口的解决办法

maven-shade-plugin是一个比较有用的打包插件,p
  • Lovecat_Me
  • Lovecat_Me
  • 2014-10-31 08:39
  • 1144

maven配置生成可执行的jar:maven-shade-plugin

默认打包生成的jar是不能直接运行的,因为带有main方法的信息不会添加到mainifest中,需要借助maven-shade-plugin ... org.apache.maven.plugins maven-shade-plu...
  • xun_2008
  • xun_2008
  • 2013-11-19 22:20
  • 23829

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

现在基本上都是采用maven来进行开发管理,我有一个需求是需要把通过maven管理的java工程打成可执行的jar包,这样也就是说必需把工程依赖的jar包也一起打包。而使用maven默认的package命令构建的jar包中只包括了工程自身的class文件,并没有包括依赖的jar包。我们可以通过配置插...
  • l1028386804
  • l1028386804
  • 2016-12-26 23:13
  • 1414

Maven程序打包成单个Jar Part 2 -- Maven shade plugin

Maven使用shade plugin将项目打包成单个jar
  • cloud_ll
  • cloud_ll
  • 2016-07-09 11:47
  • 715

使用maven-shade-plugin构建可执行jar

org.apache.maven.plugins maven-shade-plugin 1.4 package shade implementation="org.apache.maven.plugins.shade.resource.Manifest...
  • czp11210
  • czp11210
  • 2015-09-16 17:58
  • 1783

使用maven-shade-plugin插件打可执行jar包

背景: 现在基本上都是采用maven来进行开发管理,我有一个需求是需要把通过maven管理的java工程打成可执行的jar包,这样也就是说必需把工程依赖的jar包也一起打包。而使用maven默认的package命令构建的jar包中只包括了工程自身的class文件,并没有包括依赖的jar包。所以根本不...
  • zhengxiangwen
  • zhengxiangwen
  • 2017-04-07 11:48
  • 1796

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

现在基本上都是采用maven来进行开发管理,我有一个需求是需要把通过maven管理的java工程打成可执行的jar包,这样也就是说必需把工程依赖的jar包也一起打包。而使用maven默认的package命令构建的jar包中只包括了工程自身的class文件,并没有包括依赖的jar包。我们可以通过配置插...
  • z69183787
  • z69183787
  • 2016-11-01 17:36
  • 4089

maven-shade-plugin打Jar包的相关问题

问题如下:问题1:使用maven-shade-plugin插件,打超级JAR包时,运行maven install出错如下。Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:2.0:shade (default) on...
  • qq_25827845
  • qq_25827845
  • 2017-02-10 18:58
  • 1081
    个人资料
    • 访问:1517582次
    • 积分:22609
    • 等级:
    • 排名:第378名
    • 原创:624篇
    • 转载:133篇
    • 译文:60篇
    • 评论:189条
    博客专栏
    文章分类
    最新评论