2016-09-16 52 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

相關問題