web-dev-qa-db-ja.com

Mavenマルチモジュールプロジェクトで、1つの子のプラグインを無効にするにはどうすればよいですか?

私はmavenマルチモジュールプロジェクトを持っています(男の子、私はこのオープニングwayをこのサイトで何度も書きました)。ほとんどすべてのモジュール(つまり、codeが含まれているモジュール)がmaven-site-pluginを実行して、コードカバレッジなどに関するレポートを生成する必要があります。これらには、詳細な共有構成があります-どのレポートを実行するか、どのファイルを特定のプラグイン用にカバー/除外するかなどです。

ただし、パッケージ化を扱ういくつかのモジュールがあります-アセンブリプラグインを実行してtarballを生成するなどです。これらは、サイトレポートを実行しても何も得られません-分析するコードも、レポートするテストもありません。

だから私はプラグイン設定を共有するを必要とする多くのモジュールとプラグインを実行しないを必要とするいくつかのモジュールがあります。親POMの<build>セクションにプラグインを配置すると、前者(共有構成)を実行できますが、この場合、必要なときにプラグインをオフにできないようです。構成を各モジュールの独自のPOMにプッシュする場合、後者を実行できます(プラグインの実行は避けます)が、この場合、構成情報を共有するための適切な方法がわかりません。

私が欲しいのは-子モジュールによって時々無効にされるプラグインのための共有設定-さえ可能ですか?もしそうなら、どうですか?

43
Coderer

「プラグインを実行する」とは、プラグインがライフサイクルフェーズにバインドされていることを意味し、一部のモジュールでプラグインをアンバインドしたいと考えています。最初に、プラグインを必要としないモジュールに1つの親があり、別の親を持つモジュールがあるようにPOM継承を変更することを検討できます。これを実行したくない場合は、子モジュールで実行フェーズを明示的に「なし」に設定できます。例えば。次のような親pom構成がある場合:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <executions>
        <execution>
            <id>i-do-something</id>
            <phase>initialize</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                ... lots of configuration
            </configuration>
        </execution>
    </executions>
</plugin>

次に、子モジュールでこれを行うことができます:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <executions>
        <execution>
            <id>i-do-something</id>
            <phase/>
        </execution>
    </executions>
</plugin>

これは同じプラグインと同じ実行IDであるため、親で指定された構成をオーバーライドし、プラグインは子プロジェクトのフェーズにバインドされません。

74
Ryan Stewart

親pomで抑制したい実行がidでタグ付けされている場合、Ryan Stewartの回答が機能します。ただし、親pomが実行にidのタグを付けていない場合(そしてもちろん、その親pomを編集できない場合)、次の操作を行うと、親pomのアクションが抑制されることがわかりました。

  1. まず、実行のフェーズをnoneに設定します
  2. 別の実行を作成し、idを指定して、必要な処理を実行します。
  3. mvn help:effective-pomを実行して、必要なものを親pomから正しく抑制したことを確認します。

次に例を示します。これは、私の親のpomが次のようになったものです。

    <plugin>
      <artifactId>maven-source-plugin</artifactId>
      <version>2.1.2</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
      <inherited>true</inherited>
    </plugin>

目標をjar-no-forkに変更する必要がありました。親pomでの実行には、無効にするために使用できるidがないことに注意してください。だからここに私の子供ポンポンに追加されたものです:

            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>none</phase>
                    </execution>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

結果として、これはeffective-pomがどのように見えるかです:

      <plugin>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.2.1</version>
        <executions>
          <execution>
            <phase>none</phase>
            <goals>
              <goal>jar</goal>
            </goals>
            <configuration>
              <archive>
                <compress>false</compress>
              </archive>
            </configuration>
          </execution>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar-no-fork</goal>
            </goals>
            <configuration>
              <archive>
                <compress>false</compress>
              </archive>
            </configuration>
          </execution>
        </executions>
        <inherited>true</inherited>
        <configuration>
          <archive>
            <compress>false</compress>
          </archive>
        </configuration>
      </plugin>

これにより、目標jarが実行されず、目標jar-no-forkのみが実行されることが保証されました。これは、私が達成したかったことです。

2
Alok Lal