X

Apache Maven Shade Plugin的用途

maven的shade插件,官方说明如下:

这个插件能把所有的依赖打进一个jar里,形成一个超级jar包,这样做的好处是你打出的jar包可以独立运行,就和你用spring boot打出的jar包一样,拷贝到任何机器上,只要有java环境,jar包就能运行. 还有一个重要作用则是解决冲突的重要手段. 他甚至能够将依赖的jar包里的类解压出来,打进超级jar包的classPath,所以你可以理解的是,他的作用就是把依赖打进jar包。

 

  1. 那么我们如何打出一个可执行的jar包呢,其实很简单, 只要指定mainClass就可以了
<project>
  ...
  <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>
  ...
</project>

2.  解决冲突

这个也很容易理解, 如果是一个小工程,冲突很少可能你没遇到,但是一旦工程大了或者依赖的jar包多了,就会各种冲突,尤其是 log4j,logback各种冲突,就会导致你各种class找不到的问题.

尤其是在A厂,写个jar包,恨不得把所有的jar包都引进来,而且还经常各种不兼容升级, 所以各种冲突不断。曾经为了解决一个jar包升级,弄了一下午,将这个jar包升级前后,通过mvn dependency:tree一行行的比对,才找到冲突所在.

那么有了这个插件,你怎么解决冲突问题呢?那就要用到他的一个功能,叫Relocating Classes ,这个relocation可以将类改个package的名字,成为一个新的类,这不就解决了冲突的问题吗?

举个例子,

Dubbo 是一个分布式的服务框架,其中的一种 rpc 实现(dubbo 协议)使用 hessian 3.2.0 来做序列化,另外一种实现(hsf协议)同样使用了 hesssian,但使用的版本是 3.0.14。如果现在一个应用中同时使用了 dubbo 协议和 hsf 协议,这个时候应用使用哪个版本的 hessian 呢?使用 3.2.0 可能会影响 hsf 协议,如果使用 3.0.14 那么 dubbo 协议会受影响。

maven shade plugin 能够把项目中依赖的 jar 包中的一些类文件打包到项目构建生成的 jar 包中,在打包的时候它有一个非常重要的特性是支持 relocation。relocation 的意思是把类重命名,比如把 com.caucho.hessian.io.HessianInput 重命名为 hidden.com.caucho.hessian.io.HessianInput,这样就不会出现冲突了。

 

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.7.1</version>
                <executions>
                    <execution>
                        <id>shade-hessian</id>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <includes>
                                    <include>hessian:hessian</include>
                                </includes>
                            </artifactSet>
                            <createSourcesJar>true</createSourcesJar>
                            <relocations>
                                <relocation>
                                    <pattern>com.caucho</pattern>
                                    <shadedPattern>com.alibaba.dubbo.hsf.hessian.v3_0_14_bugfix</shadedPattern>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

 

 

Categories: Java学习
龙安_任天兵: 不忘初心,方得始终!