是什么决定了 pom.xml 的 <build> 部分中的 Maven 插件版本?

What determines the Maven plugins versions in the <build> section of pom.xml?

我正在使用 Eclipse Kepler 和 M2E。我创建了一个空的 Eclipse 项目,直接转换为 Maven 项目。 pom.xml 已清理:没有依赖项或构建部分,没有父 POM。 Maven settings.xml 是默认的:不包含任何信息。

在查阅 Effective POM 时感谢 M2E,存在很多插件:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>testTCO</groupId>
  <artifactId>testTCO</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <repositories>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Central Repository</name>
      <url>http://repo.maven.apache.org/maven2</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Central Repository</name>
      <url>http://repo.maven.apache.org/maven2</url>
    </pluginRepository>
  </pluginRepositories>
  <build>
    <sourceDirectory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\src\main\java</sourceDirectory>
    <scriptSourceDirectory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\src\main\scripts</scriptSourceDirectory>
    <testSourceDirectory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\src\test\java</testSourceDirectory>
    <outputDirectory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\target\classes</outputDirectory>
    <testOutputDirectory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\target\test-classes</testOutputDirectory>
    <resources>
      <resource>
        <directory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\src\main\resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\src\test\resources</directory>
      </testResource>
    </testResources>
    <directory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\target</directory>
    <finalName>testTCO-0.0.1-SNAPSHOT</finalName>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <version>2.4.1</version>
        <executions>
          <execution>
            <id>default-clean</id>
            <phase>clean</phase>
            <goals>
              <goal>clean</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.5</version>
        <executions>
          <execution>
            <id>default-testResources</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>testResources</goal>
            </goals>
          </execution>
          <execution>
            <id>default-resources</id>
            <phase>process-resources</phase>
            <goals>
              <goal>resources</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3.2</version>
        <executions>
          <execution>
            <id>default-jar</id>
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <executions>
          <execution>
            <id>default-compile</id>
            <phase>compile</phase>
            <goals>
              <goal>compile</goal>
            </goals>
          </execution>
          <execution>
            <id>default-testCompile</id>
            <phase>test-compile</phase>
            <goals>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.10</version>
        <executions>
          <execution>
            <id>default-test</id>
            <phase>test</phase>
            <goals>
              <goal>test</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.3.1</version>
        <executions>
          <execution>
            <id>default-install</id>
            <phase>install</phase>
            <goals>
              <goal>install</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.7</version>
        <executions>
          <execution>
            <id>default-deploy</id>
            <phase>deploy</phase>
            <goals>
              <goal>deploy</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-site-plugin</artifactId>
        <version>3.0</version>
        <executions>
          <execution>
            <id>default-site</id>
            <phase>site</phase>
            <goals>
              <goal>site</goal>
            </goals>
            <configuration>
              <outputDirectory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\target\site</outputDirectory>
              <reportPlugins>
                <reportPlugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-project-info-reports-plugin</artifactId>
                </reportPlugin>
              </reportPlugins>
            </configuration>
          </execution>
          <execution>
            <id>default-deploy</id>
            <phase>site-deploy</phase>
            <goals>
              <goal>deploy</goal>
            </goals>
            <configuration>
              <outputDirectory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\target\site</outputDirectory>
              <reportPlugins>
                <reportPlugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-project-info-reports-plugin</artifactId>
                </reportPlugin>
              </reportPlugins>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <outputDirectory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\target\site</outputDirectory>
          <reportPlugins>
            <reportPlugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-project-info-reports-plugin</artifactId>
            </reportPlugin>
          </reportPlugins>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <reporting>
    <outputDirectory>C:\stuff\eclipse-jee-kepler_64\workspace\wosp\testTCO\target\site</outputDirectory>
  </reporting>
</project>

例如加载了插件 maven-resources-plugin 的 2.5 版。为什么是这个版本而不是更新的版本?

我知道我可以通过在 pom.xml 中指定插件和所需版本来覆盖它,但我想知道这些默认版本值是如何加载的。

超级POM包含了有效POM的一部分内容,但大部分插件似乎不知从何而来。

这是Super POM and Maven default bindings的组合。

Super POM 是一种特殊的 POM,所有 POM 都隐式继承自该 POM。它定义了所有 Maven 项目将共享的各种默认属性。它还用于修复最常用插件的插件版本。对于 Maven 3.3.9,这个 POM 只定义了那些版本。

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>1.3</version>
</plugin>
<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-5</version>
</plugin>
<plugin>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>2.8</version>
</plugin>
<plugin>
  <artifactId>maven-release-plugin</artifactId>
  <version>2.3.2</version>
</plugin>

但是请注意这里的注释:

<!-- NOTE: These plugins will be removed from future versions of the super POM -->
<!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->

链接到 Maven 问题 MNG-4453。如今,插件版本是在给定生命周期的默认绑定中定义的,并且很可能会删除当前存在于 Super POM 中的内容。

可以在 META-INF/plexus/default-bindings.xml 文件中找到这些绑定。作为参考,这是 jar 包装的样子:

<phases>
  <process-resources>
    org.apache.maven.plugins:maven-resources-plugin:2.6:resources
  </process-resources>
  <compile>
    org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile
  </compile>
  <process-test-resources>
    org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
  </process-test-resources>
  <test-compile>
    org.apache.maven.plugins:maven-compiler-plugin:2.5.1:testCompile
  </test-compile>
  <test>
    org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
  </test>
  <package>
    org.apache.maven.plugins:maven-jar-plugin:2.4:jar
  </package>
  <install>
    org.apache.maven.plugins:maven-install-plugin:2.4:install
  </install>
  <deploy>
    org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
  </deploy>
</phases>

插件的默认版本绑定到打包的特定阶段,您的构建将从这些阶段继承。

super pom defines some parts (folder structure) but the life cycle binding defines other parts like the binding to the appropriate life cycle phases. The life cycle phases itself are defined here.

插件的版本取决于您使用的 Maven 版本,因为正在更新生命周期绑定。如果您想确定正在使用哪个版本的插件,最好的做法是在您的 pom 中通过 pluginManagement 定义您正在使用的所有插件,这应该在公司 pom 文件中完成以避免重复。