15

継承ではなく構成によって Maven プラグイン構成をインポートします。ビルド拡張機能で実行できますか?

私は 3 年以上 maven を使用してきましたが、常に私を悩ませてきた欠点が 1 つあります。すでにその解決策を見つける時が来ました。

問題:

「男の子」、「女の子」、「子供」の3人の子供を持つ「パパ」mavenモジュールがあります。これらの各子には、デフォルトの「クリーン インストール」ビルド用の独自のプラグイン構成セットが必要です。その構成を子供のポンに入れたくありません。後で再利用できる場所に置きたいと思います。

そのためにプロファイルを使用してみましたが、うまくいきません - MNG-5127に関する私のコメントと添付のプロジェクトを参照してください

daddy.zipプロジェクトに次の変更を加えることで、より良い解決策を見つけました。

1) パパの pom で、[profiles] を [phase]none[/phase] を持つプラグイン実行に置き換えました

<build>
    ...
    <plugins>
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>printboy</id>
                    <phase>none</phase>
                    <configuration>
                        <target>
                            <echo message="@@@@@@@@@@@@ HELLO! Iam a BOY project"/>
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
                <execution>
                    <id>printkid</id>
                    <phase>none</phase>
                    <configuration>
                        <target>
                            <echo message="@@@@@@@@@@@@ HELLO! Iam a KID project"/>
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
                <execution>
                    <id>printgirl</id>
                    <phase>none</phase>
                    <configuration>
                        <target>
                            <echo message="@@@@@@@@@@@@ HELLO! Iam a GIRL project"/>
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    ...
</build>

2)同じポンで、カスタムビルド拡張機能を追加しました

<build>
    <extensions>
        <extension>
            <groupId>br.com.touchtec.maven.plugins</groupId>
            <artifactId>execution-enabler-extension</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </extension>
    </extensions>
    ...
</build>

3) 拡張機能は、プロジェクトのプロパティ値に基づいてプラグインの実行フェーズを変更します。以下のJavaコード。

@Component(role = AbstractMavenLifecycleParticipant.class, hint = "enableif")
public class EnableIfExtension extends AbstractMavenLifecycleParticipant {

    @Override
    public void afterProjectsRead(MavenSession session)
            throws MavenExecutionException {
        String phase = "validate";
        for(MavenProject project : session.getProjects()){
            Properties properties = project.getProperties();
            if(properties != null){
                if("boy".equals(properties.getProperty("project_type"))){
                    setExecutionPhase(project, "printboy", phase);
                    setExecutionPhase(project, "printkid", phase);
                }
                if("girl".equals(properties.getProperty("project_type"))){
                    setExecutionPhase(project, "printgirl", phase);
                    setExecutionPhase(project, "printkid", phase);
                }
                if("kid".equals(properties.getProperty("project_type"))){
                    setExecutionPhase(project, "printkid", phase);
                }
            }
        }
    }

    private void setExecutionPhase(MavenProject project, String executionId, String phase) {
        for(Plugin plugin : project.getBuild().getPlugins()){
            if(plugin.getExecutions() != null){
                for(PluginExecution execution : plugin.getExecutions()){
                    if(executionId.equals(execution.getId())){
                        execution.setPhase(phase);
                    }
                }
            }
        }
    }
}

4) 子モジュール poms は、ビルド拡張機能に何をすべきかを伝えるプロパティを定義するだけで済みます。たとえば、boy プロジェクトは次のようになります。

<project>
    <properties>
        <project_type>boy</project_type>
    </properties>

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.family</groupId>
    <artifactId>boy</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>com.family</groupId>
        <artifactId>daddy</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <!-- No "build" section. Beautifull. -->
</project>

このようにパパ プロジェクトで mvn clean install を呼び出すと、目的の結果が出力されます。男の子は男の子、女の子は女の子、両方とも子供になります。

問題は、もっとうまくやれるかどうかです。

理論的には、ビルド拡張機能は、男の子、女の子、子供のビルド構成定義をさまざまな poms からインポートできます...そうですか? これは、[ビルド] 構成を pom にインポートするための巧妙でエレガントな方法です。

利用可能な Maven プラグインはたくさんありますが、ビルドにプラグインできる利用可能なビルド拡張機能は (実際には) あまり多くありません。これに役立つビルド拡張機能を知っている人はいますか?


アップデート

これは実際の答えではありませんが、私の問題に対する実際の解決策なので、ここに行きます。

継承ではなく構成によって Maven プラグイン構成をインポートします。ビルド拡張機能で実行できますか?

おそらく

これに役立つビルド拡張機能を知っている人はいますか?

1つもないと確信している

ただし、プロファイルを使用した解決策があります。

秘訣は、ファイルベースのプロファイルアクティベーションが実際に継承されることです(ただし、maven3でのみ機能します)

MNG-5127に添付されているdaddy2.zipをご覧ください

プロファイルを使用すると、いくつかのプラグイン実行フェーズを変更するよりも柔軟性が高くなるため、ビルド拡張戦略を使用するよりもはるかに優れています。


更新 2

これに役立つビルド拡張機能を知っている人はいますか?

1つもないと確信している

実はあるんです!

MNG-5102 (by Maurizio Pillitu) にプロジェクトとして添付されています。テストはしていませんが、提案されたビルド拡張機能に非常に近いものを実行しているようです。

4

1 に答える 1

8

Maven Tilesは、特定のユースケースに役立つと思います。まだ進行中の作業ですが、現在、あなたが説明していることを達成しています。マルチモジュール構造を追加しても、ウィケットクイックスタートを「分解」してJettyを正常に実行できました。

コメントやヒントは大歓迎です。ありがとう、マウリツィオ

于 2012-08-06T13:23:51.177 に答える