今天在項目的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