1. 程式人生 > >maven-shade-plugin插件未生效原因分析

maven-shade-plugin插件未生效原因分析

-c 檢查 art cut 原因 uber name https 為什麽

今天在項目的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元素身上!!
要搞清楚為什麽會出現這種情況,就要說說pluginManagementplugins這兩個元素的區別了。

  • 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

maven-shade-plugin插件未生效原因分析