pluginManagement会干扰阴影插件

时间:2018-12-25 02:13:01

标签: maven maven-shade-plugin uberjar

从Maven真正开始;马上有一个很大的惊喜。

我理解(或我认为)胖罐子/超级罐子的概念。将代码与所有依赖项打包在一起,以此类推。maven-shade-plugin,在一些示例中找到了文档,并检查了其是否有效。现在将其添加到我的POC项目中,该项目来自maven-archetype-quickstart-可能出什么问题了,是吧?

简而言之,快速入门按照以下方式进行安排:

<build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
         <plugin>
          ...

所以我只是扔了一个用于着色的插件,准备每天称呼它:

<!-- Maven Shade Plugin -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
          <!-- Run shade goal on package phase -->
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>

不太快。首先,我注意到mvn clean package并没有提到正在执行maven-shade-plugin(就像工作示例一样)。经过数小时的搜索,我盯着脸上的“根本原因”-快速入门原型提供的<pluginManagement>莫名其妙地。神奇地删除该标签使maven.shade.plugin可以完成其工作。否则,不。

(副本:https://github.com/alexakarpov/shade-me unshade是坏分支,master是好分支。

谈论违反最小惊讶原则,eh =) 有人可以解释发生了什么吗?生成的pom中的注释提到了有关父pom的内容,但是我尚未对多pom设置进行任何操作。

1 个答案:

答案 0 :(得分:0)

<pluginManagement>角色在Maven documentation中进行了描述:

  

插件管理包含插件元素的方式与插件非常相似,除了不是为该特定项目构建配置插件信息,而是要配置从此项目继承的项目构建。

在原型生成的项目中,它的目标是设置默认版本的默认插件maven-clean-pluginmaven-jar-plugin,...)。请注意,这些默认插件没有出现在您的POM <plugins>部分中,但被隐式声明为 (您可以通过运行mvn help:effective-pom对其进行检查)。

但是将插件添加到<pluginManagement>部分并不会使您的项目调用该插件。在这里,您可以设置配置和要使用的插件版本。要调用该插件,您应该在<plugins>部分中对其进行绝对声明。

在某些项目中(大多数情况下是多模块项目),您可以看到在父POM的<pluginManagement>中声明了插件及其配置,然后在需要调用以下信息的模块的<plugins>部分中进行了引用该插件:因此,您不必在每个模块上重复相同的配置。

如果要使用POM继承,通常使用

<pluginManagement>。否则,在简单项目上,您只需在<plugins>部分中声明它们。我还看到了一些项目在<pluginManagement>中定义了所有配置,只是为了使<plugins>部分更短,更易读,如以下示例所示。这只是一个品味问题。

<build>
    <!-- pluginManagement section : set versions and configurations -->
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <!-- Run shade goal on package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
              </plugin>
        </plugins>
    </pluginManagement>

    <!-- plugins section : plugins that are invoked when building the project -->
    <plugins>
        <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
        </plugin>
    </plugins>
</build>

您还可以阅读有关StackOverflow的更多信息:Maven : What is pluginManagement?