2016-09-16 82 views
3

我在父POM的<pluginManagement>部分中定义插件版本,并且想要在子模块的<plugins>部分中使用它们。Maven忽略来自插件管理的插件版本在子模块的配置文件中

这是行得通的,除非在子模块的配置文件中使用插件。在这种情况下,忽略来自父POM的<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

输出 mvn versions:display-plugin-updates
<?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 
[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] ------------------------------------------------------------------------ 

我可以复制子模块内部父POM的<pluginManagement>部分的信息,以使其正常工作,但我想避免这种情况,原因很明显。

回答

1

Maven是不是忽略它,你可以通过执行以下检查:

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

effective-pom目标将:

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

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

在那里,我们可以看到:

<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忽略。

+0

然后,当运行带有配置文件p1的子项目时,OP为什么会收到警告“以下插件没有指定其版本”警告? –

+2

@LittleSanti它可能实际上是'版本 - maven-plugin'的问题,而不是Maven问题。 –

+0

看起来你是对的,A_Di_Matteo。非常感谢! – joschi