Maven插件声明顺序的微妙差别

                       

本文原文出处: http://blog.csdn.net/bluishglc/article/details/50380880 严禁任何形式的转载,否则将委托CSDN官方维护权益!

看这样一个非常有趣的问题:

某个项目需要这样进行package操作:

  • 通过maven-jar-plugin率先得到本项目的jar包,之所以显式地配置jar插件是因为要排除掉一些不必要的文件
  • 紧接着,使用maven-shade-plugin,把项目的jar包和其依赖的jar打成一个all-in-one的大jar包。这并不是一种优雅的处理方式,但是限于某些环境的特殊需求,你可能必须这样选择
  • 最后,使用maven-assembly-plugin把最终得到的all-in-one的jar包和一些shell文件以及配置文件按照通常的组织方式(比如bin,lib,conf等文件夹)打包成一个分发包

插一句题外话,有人可能会在看到项目中同时使用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>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

在生成的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>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
           

猜你喜欢

转载自blog.csdn.net/qq_44919253/article/details/89513886