pluginManagement 干扰阴影插件

pluginManagement interferes with shade plugin

真正开始使用 Maven;马上就有惊喜了。

我理解(或者我认为我理解)脂肪的概念jar/uberjars。将您的代码与所有依赖项等打包。 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(就像工作示例那样)。接下来是几个小时的搜索,我正盯着 "root cause" 的脸 - <pluginManagement>,由 quickstart archetype 提供,是吗 - 不知何故 。神奇地删除该标签允许 maven.shade.plugin 完成它的工作。否则不行。

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

谈论违反最小惊喜原则,嗯=) 有人可以解释发生了什么吗?生成的 pom 中的评论提到了有关父 pom 的内容,但我还没有对多 pom 设置做任何事情..

<pluginManagement>作用在Maven documentation中描述:

Plugin Management contains plugin elements in much the same way [than plugins], except that rather than configuring plugin information for this particular project build, it is intended to configure project builds that inherit from this one.

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

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

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

<pluginManagement>主要是想使用POM继承时使用。否则,对于简单的项目,您可以在 <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>

您还可以在 Whosebug 上阅读更多内容:Maven : What is pluginManagement?