Maven在子模块的配置文件中忽略pluginManagement中的插件版本

时间:2016-09-16 15:27:39

标签: maven maven-3 pom.xml versions-maven-plugin

我在父POM的1> c(kitty_gen_server). {ok,kitty_gen_server} 2> {ok, P} = kitty_gen_server:start_link(). {ok,<0.64.0>} 3> kitty_gen_server:close_shop(P). ok 部分定义了插件版本,并希望在子模块的<pluginManagement>部分中使用它们。

除非在子模块的配置文件中使用插件,否则这是有效的。在这种情况下,将忽略父POM <plugins>部分中的版本。

<pluginManagement>的输出:

mvn -v

Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T17:41:47+01:00) Maven home: /usr/local/Cellar/maven/3.3.9/libexec Java version: 1.8.0_102, vendor: Oracle Corporation Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre Default locale: de_DE, platform encoding: UTF-8 OS name: "mac os x", version: "10.11.6", arch: "x86_64", family: "mac"

./pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <prerequisites> <maven>3.1.0</maven> </prerequisites> <modules> <module>project1</module> </modules> <groupId>org.example.test</groupId> <artifactId>test-parent</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <build> <pluginManagement> <plugins> <plugin> <groupId>com.github.eirslett</groupId> <artifactId>frontend-maven-plugin</artifactId> <version>1.0</version> </plugin> </plugins> </pluginManagement> </build> </project>

./project1/pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <prerequisites> <maven>3.1.0</maven> </prerequisites> <parent> <groupId>org.example.test</groupId> <artifactId>test-parent</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <artifactId>project1</artifactId> <profiles> <profile> <id>p1</id> <build> <plugins> <plugin> <groupId>com.github.eirslett</groupId> <artifactId>frontend-maven-plugin</artifactId> </plugin> </plugins> </build> </profile> </profiles> </project> 的输出:

mvn versions:display-plugin-updates

我可以复制子模块中父POM的$ mvn versions:display-plugin-updates [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] test-parent [INFO] project1 [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building test-parent 1.0.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- versions-maven-plugin:2.2:display-plugin-updates (default-cli) @ test-parent --- [INFO] [INFO] All plugins with a version specified are using the latest versions. [INFO] [INFO] Project defines minimum Maven version as: 3.1.0 [INFO] Plugins require minimum Maven version of: 3.1.0 [INFO] Note: the super-pom from Maven 3.3.9 defines some of the plugin [INFO] versions and may be influencing the plugins required minimum Maven [INFO] version. [INFO] [INFO] No plugins require a newer version of Maven than specified by the pom. [INFO] [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building project1 1.0.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- versions-maven-plugin:2.2:display-plugin-updates (default-cli) @ project1 --- [INFO] [INFO] All plugins with a version specified are using the latest versions. [INFO] [WARNING] The following plugins do not have their version specified: [WARNING] com.github.eirslett:frontend-maven-plugin ................. 0.0.26 [INFO] [INFO] Project defines minimum Maven version as: 3.1.0 [INFO] Plugins require minimum Maven version of: 3.1.0 [INFO] Note: the super-pom from Maven 3.3.9 defines some of the plugin [INFO] versions and may be influencing the plugins required minimum Maven [INFO] version. [INFO] [INFO] No plugins require a newer version of Maven than specified by the pom. [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] test-parent ........................................ SUCCESS [ 0.851 s] [INFO] project1 ........................................... SUCCESS [ 0.314 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.649 s [INFO] Finished at: 2016-09-16T16:03:04+02:00 [INFO] Final Memory: 13M/247M [INFO] ------------------------------------------------------------------------ 部分的信息以使其正常工作,但我想避免这种情况显而易见。

1 个答案:

答案 0 :(得分:2)

Maven没有忽略它,您可以通过执行以下命令来检查它:

mvn -pl project1 help:effective-pom -Doutput=noProfilePom.xml

effective-pom目标将:

  

将有效POM显示为此版本的XML,并将活动配置文件考虑在内。

检查生成的noProfilePom.xml,您会看到Maven在构建pom.xml模块的project1时会有效运行。

我们可以看到:

<pluginManagement>
  <plugins>
    ...
    <plugin>
      <groupId>com.github.eirslett</groupId>
      <artifactId>frontend-maven-plugin</artifactId>
      <version>1.0</version>
    </plugin>
  </plugins>
</pluginManagement>
<plugins>
  ...  
  <plugin>
    <artifactId>maven-clean-plugin</artifactId>
    <version>2.5</version>
    <executions>
      <execution>
        <id>default-clean</id>
        <phase>clean</phase>
        <goals>
          <goal>clean</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
    ...
</plugins>

因此,pluginManagement已正确合并(取自父级),而plugins部分未提供。

但是运行以下内容:

mvn -pl project1 -Pp1 help:effective-pom -Doutput=withProfilePom.xml

注意:我们也会通过-Pp1激活个人资料,作为目标执行的一部分。

生成的withProfilePom.xml的一部分将包含:

<pluginManagement>
  <plugins>
    ...
    <plugin>
      <groupId>com.github.eirslett</groupId>
      <artifactId>frontend-maven-plugin</artifactId>
      <version>1.0</version>
    </plugin>
  </plugins>
</pluginManagement>
<plugins>
  <plugin>
    <groupId>com.github.eirslett</groupId>
    <artifactId>frontend-maven-plugin</artifactId>
    <version>1.0</version>
  </plugin>

  <plugin>
    <artifactId>maven-clean-plugin</artifactId>
    <version>2.5</version>
    <executions>
      <execution>
        <id>default-clean</id>
        <phase>clean</phase>
        <goals>
          <goal>clean</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
    ...
</plugins>

这次p1配置文件处于活动状态,并且已正确地将plugins部分注入其插件声明,然后从父设备的pluginManagement获取其版本。

因此:个人资料中声明的pluginManagement不会忽略plugin部分。