## 四、maven-shade-plugin插件
`maven-shade-plugin`比`maven-assembly-plugin`功能更为强大,比如你的工程依赖很多的JAR包,而被依赖的JAR又会依赖其他的JAR包,这样,当工程中依赖到不同的版本的 JAR时,并且JAR中具有相同名称的资源文件时,shade插件会尝试将所有资源文件打包在一起时,而不是和assembly一样执行覆盖操作。
### 4.1 基本配置
采用`maven-shade-plugin`进行打包时候,配置示例如下:
```xml
org.apache.maven.pluginsmaven-shade-plugintrue*:*META-INF/*.SFMETA-INF/*.sfMETA-INF/*.DSAMETA-INF/*.dsaMETA-INF/*.RSAMETA-INF/*.rsaMETA-INF/*.ECMETA-INF/*.ecMETA-INF/MSFTSIG.SFMETA-INF/MSFTSIG.RSAorg.apache.storm:storm-corepackageshade
```
以上配置来源于Storm的Github仓库,在上面的配置中,排除了部分文件,这是因为有些JAR包生成时,会使用jarsigner生成文件签名(完成性校验),分为两个文件存放在META-INF目录下:
- a signature file, with a .SF extension;
- a signature block file, with a .DSA, .RSA, or .EC extension;
如果某些包的存在重复引用,这可能会导致在打包时候出现`Invalid signature file digest for Manifest main attributes`异常,所以在配置中排除这些文件。
### 4.2 打包命令
使用maven-shade-plugin进行打包的时候,打包命令和普通打包一样:
```shell
# mvn package
```
打包后会生成两个JAR包,提交到服务器集群时使用非original开头的Jar。
## 五、使用非Maven仓库中的Jar
通常上面两种打包能够满足大多数的使用场景。但是如果你想把某些没有被Maven管理Jar包打入到最终的Jar中,比如你在`resources/lib`下引入的其他非Maven仓库中的Jar,此时可以使用`maven-jar-plugin`和`maven-dependency-plugin`插件将其打入最终的Jar中。
```xml
org.apache.maven.pluginsmaven-jar-plugintruelib/com.heibaiying.BigDataApporg.apache.maven.pluginsmaven-dependency-plugincopycompilecopy-dependencies
${project.build.directory}/lib
```
## 六、排除集群中已经存在的Jar
为了避免冲突通常官方文档通常都会建议你排除集群中已经提供的Jar包,如下:
Spark 官方文档 Submitting Applications 章节:
> When creating assembly jars, list Spark and Hadoop as `provided` dependencies; these need not be bundled since they are provided by the cluster manager at runtime.
Strom官方文档 Running Topologies on a Production Cluster 章节:
>Then run mvn assembly:assembly to get an appropriately packaged jar. Make sure you exclude the Storm jars since the cluster already has Storm on the classpath.
+ 对需要排除的Jar包依赖添加`provided`标签,此时该Jar包会被排除,但是不建议使用这种方式,因为此时你在本地运行也无法使用该Jar包;
+ 建议直接在`maven-assembly-plugin`或`maven-shade-plugin`的配置文件中使用``进行排除。
## 七、使用建议
通常使用`maven-shade-plugin`就能够完成大多数的打包需求,其配置简单且适用性最广,因此建议使用此方式。
## 参考资料
关于Maven各个插件的详细配置可以查看其官方文档:
+ maven-assembly-plugin : http://maven.apache.org/plugins/maven-assembly-plugin/
+ maven-shade-plugin : http://maven.apache.org/plugins/maven-shade-plugin/
+ maven-jar-plugin : http://maven.apache.org/plugins/maven-jar-plugin/
+ maven-dependency-plugin : http://maven.apache.org/components/plugins/maven-dependency-plugin/
关于maven-shade-plugin的更多配置也可以参考该博客: [maven-shade-plugin 入门指南](https://www.jianshu.com/p/7a0e20b30401)