今天在项目的 pom 文件中引入 maven-shade-plugin 插件,构建一个 uber-jar(包含所有依赖的 jar 包),但是诡异的事情出现了,执行 mvn package
后生成的 jar 包竟然没有包含被依赖的 jar 包,以前从来没遇到这种情况,下面是我的 pom 文件中关于 plugins 的片段:
<build>
<finalName>iot-kafkamsg</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>cn.wxyidea.KafkaMsgDemo</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
在认真检查了 pom 文件配置后,仍然没有发现异常,于是只好求助 google 了。在折腾了将近两个小时,总算在 stackoverflow 上面找到了答案,原来问题的关键是出在了 pluginManagement 元素身上!!
要搞清楚为什么会出现这种情况,就要说说 pluginManagement 和 plugins 这两个元素的区别了。
- pluginManagement 是一种在项目的多个模块中共享相同插件配置的方法, 它旨在配置可以被其它模块继承的插件信息,即是对插件的声明,在 pluginManagement 中配置 plugins,执行 maven 命令时,不会被 maven 加载。
pluginManagement 中声明的插件可以被当前 pom 或子 pom 中引用,比如你在项目的父 pom 中使用 pluginManagement 声明插件,那么在子 pom 中可以继承该插件,只需要在 plugins 节点中配置 groupId 和 artifactId 就可以完成插件的引用。- plugins 才是插件的实际调用,它可以自己定义 plugin,也可以从父 pom 的 pluginManagement 中继承。
回到我的问题上来,现在终于知道问题所在了。我在 pluginManagement 中配置了 plugin,在执行 mvn package
时,maven 不会去加载 pluginManagement 中声明的 maven-shade-plugin,所以生成的 jar 包自然也就不会包含依赖了。
有两种方法解决我的问题:
(1). 删除多余的 pluginManagement 元素;
(2). 在 build 节点中增加一个 plugins 节点,引用 pluginManagement 节点中声明的插件,如下
<build>
<finalName>iot-kafkamsg</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>cn.wxyidea.KafkaMsgDemo</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<!-- 引用pluginManagement中声明的maven-shade-pluin插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
</plugins>
</build>
参考:
1). https://stackoverflow.com/questions/10483180/maven-what-is-pluginmanagement
2). https://stackoverflow.com/questions/42208526/maven-shade-plugin-is-not-called-automatically-for-goal-package?rq=1
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于