zoukankan      html  css  js  c++  java
  • maven-shade-plugin插件未生效原因分析

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

  • 相关阅读:
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
    smarty {for}{forelse}
    整理了一份比较全面的PHP开发编码规范.
    安装SQL server 提示重新启动计算机失败
    使用自定义《UIActivity》进行内容分享-b
    五子棋-b
    iOS面试题16719-b
    iOS 图片填充 UIImageView
    将UIImage保存到iOS照片库和对应程序沙盒中-b
    IOS webview中cookie的读取与保存-b
  • 原文地址:https://www.cnblogs.com/leekeggs/p/10276672.html
Copyright © 2011-2022 走看看