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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bluishglc/article/details/50380880

本文原文出处: 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>

在生成的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>
展开阅读全文

没有更多推荐了,返回首页