2017-03-31 26 views
1

私がポンポンからの継承が、そのプラグインのセクションでプラグインを宣言していない子プロジェクトを持っている奇妙な行動

<pluginManagement> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <version>2.19.1</version> 
        <configuration> 
         <parallel>classesAndMethods</parallel> 
         <threadCount>4</threadCount> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 

を定義する親ポンポンを持っています。 mavenテストの目標を実行してもプラグインが有効になっています。

+0

Pomはその親を参照していますか?あなたはmvnをどこで実行しますか? –

+0

はい。子プロジェクトはその親を参照します。私は、子モジュールのルートフォルダ内でmavenの目標を実行します。 – Shibashis

+0

親を参照している場合は、そこから構成を取得します。 –

答えて

-1

親プロジェクトでのmaven-確実なプラグインを定義します参照してください :http://maven.apache.org/surefire/maven-surefire-plugin/usage.html

<pluginManagement> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.19.1</version> 
    </plugin> 
    </plugins> 
</pluginManagement> 

構成セクションを追加するには、それは暗黙的に子プロジェクトのそれぞれに実行させます。

子プロジェクトでの設定は、子プロジェクトの設定は非常に冗長であっても、それはすべてのサブでの依存性やプラグインの同じバージョンの明示的な追加を保証

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
     <parallel>classesAndMethods</parallel> 
     <threadCount>4</threadCount> 
    </configuration> 
</plugin> 

のようになります。モジュール。

+0

この回答の説明が不明です。 「子プロジェクトは非常に冗長です」と言うと、手動でプラグインを子どもに追加することについて話していますか?はいの場合は、これを行う必要はありません。子プロジェクトのプラグインについて何も宣言する必要はありません。 'pluginManagement'の全ての設定は親から自動的に継承されるべきです。そして、この答えは、この相続がなぜ行われたのかを言わない。 – manouti

+0

'plugin'セクションの設定は自動的に継承されます。 'pluginManagement'セクションの設定は、子プロジェクトのプラグインセクションで明示的に指定された場合にのみ追加されます。 'pluginmanagement'のconfigを定義する利点は、すべてのサブモジュールが同じプラグインバージョンを使用していることです。 – Shibashis

0

maven-surefire-pluginは、built-in lifecycle bindingsの一部としてtestフェーズにデフォルトでバインドされているため、これは正常です。子プロジェクトで宣言する必要はありません。

つまり、プラグインは子プロジェクトに暗黙的に利用可能であるため、testフェーズにバインドされています。 maven-scm-plugin(他の質問にリンクされています)は、デフォルトではフェーズにバインドされていないため、親から構成を継承するために子で宣言する必要があります。しかし、maven-surefire-pluginはデフォルトでテストフェーズにバインドされているため、子フェーズで宣言する必要はありません。子モジュールでmvn help:effective-pomを実行して、有効なPOMを見てください。これは、Mavenが実際に使用する最終POMを示しています。 http://maven.apache.org/ref/3.3.9/maven-core/default-bindings.htmlをチェックして、デフォルトのプラグインバインディングを確認してください。

プラグインをスキップする場合は、mvn installを実行するか、-DskipTests=trueを渡します。あなたはまだ他のプロジェクトでテストを実行するmvn testを実行する必要がある場合は、子モジュールのPOMでテストを省略することができます(これはまったくお勧めしませんが):

<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <configuration> 
       <skipTests>true</skipTests> 
     </configuration> 
    </plugin> 
</plugins> 
+0

私は質問に追加した2つのコメントを見ていただけますか? – Shibashis

+0

@Shibashisリンクされた質問の例では、子に宣言されるプラグインがあります。しかし、 'maven-surefire-plugin'や' maven-jar-plugin'のようなプラグインでは、デフォルトで既にフェーズを構築するようにバインドされています。私は、このメモを追加するためにドキュメントを改善できると言います。これを確認するには、[プラグインのドキュメント](http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html)に「ライフサイクルフェーズにデフォルトでバインドする:テスト」と記載されています。 – manouti

+0

私は、プラグインがテスト段階に自分自身をバインドすることを理解します。しかし、私の質問は、プラグインが暗黙的に子プロジェクトで利用できるようになっている理由です。 – Shibashis