标签:
本文原文出处: http://blog.csdn.net/bluishglc/article/details/50380880 严禁任何形式的转载,否则将委托CSDN官方维护权益!
看这样一个非常有趣的问题:
某个项目需要这样进行package操作:
插一句题外话,有人可能会在看到项目中同时使用jar,shade,assembly这三个package插件时感到惶恐,实际上从我的实践经验来看,这三个插件有各自的侧重点和擅长的问题域,不存在谁替代谁的问题,而是要根据项目需要组合使用。jar是狭义的jar文件打包工具,最终交付的就是一个单一的包含了项目classes的jar包,shade则是侧重于合并依赖jar包生成一个all-in-one的jar包方面,而assembly虽然具有一定的合并依赖jar包的打包能力,但是它在这方面不如shade强大,它的主要强项在于构建一个具有特定目录结构和资源文件的分发包。
最初的配置是这样的:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${jar.version}</version>
<configuration>
<excludes>
<exclude>bin/**</exclude>
<exclude>deploy.bat</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>${assembly.version}</version>
<inherited>false</inherited>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptors>
<descriptor>src/main/assembly/bin.xml</descriptor>
</descriptors>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>${shade.version}</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
在生成的target目录下,得到类似如下的几个重要文件:
xxx.jar (大约15M )
original-xxx.jar (大约10K )
xxx-bin.zip ~10K (大约10K )
解释一下这三个文件的来历:
original-xxx.jar最初是由jar插件生成的只包含项目自身classes的jar包,所以它很小,它被创建之初时名字是xxx.jar,是后续的shade插件在工作时,将其重命名的, shade将xxx.jar及其依赖的jar打包在一起,为了避免重名而将原来的xxx.jar更名为了original-xxx.jar,新的xxx.jar是所有依赖jar的合集,所以体积很大。xxx-bin.zip就是包含了xxx.jar的一个最后的发行包。
然而这份配置却有一个重大的bug:
我们可以看到xxx-bin.zip文件是很小的,它里面的xxx.jar并不是经过shade处理后的all-in-one的大jar包,而是在jar打包阶段生成的那个原始的较小的xxx.jar。虽然上述三个插件无一例外地都绑定到了package这个phase上,但三者之间还是有一个“先来后到”的顺序,这个bug在暗示我们,根据上面的这份配置中,maven率先执行的jar插件,然后执行了assembly,这是为什么zip包中包含的是经过jar插件生成的那个原始xxx.jar而不是经过shadee插件生成的那个all-in-one大jar包的原因,因为shade插件放在了最后面执行了,所以是最后生成的all-in-one的大jar包,也就错过zip打包的过程。所以说,maven对于绑定到同一phase上的多个插件的执行顺序是按照它们在pom.xml声明的顺序来的。
所以修改这个bug的方案也就清楚了,我们只需要调整一下这三个插件的声明顺序就可以了,把之前的maven-jar-plugin -> maven-assembly-plugin -> maven-shade-plugin 修改为maven-jar-plugin -> maven-shade-plugin -> maven-assembly-plugin 即可。
以下是修改后的版本:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${jar.version}</version>
<configuration>
<excludes>
<exclude>bin/**</exclude>
<exclude>deploy.bat</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>${shade.version}</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>${assembly.version}</version>
<inherited>false</inherited>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptors>
<descriptor>src/main/assembly/bin.xml</descriptor>
</descriptors>
</configuration>
</plugin>
标签:
原文地址:http://blog.csdn.net/bluishglc/article/details/50380880