2

maven-compiler-plugin 用の新しいコンパイラを作成しました。このコンパイラは、src/main/groovy と src/main/java の両方でコンパイル ソースを探します。同様に、テスト ソースは src/test/groovy と src/test/java の両方にあります。

ユーザーが pom を拡張してビルド用の新しいソース フォルダーを指定できるようにすることは承知していますが、このプラグインの使用は pom に 20 行をbuild-helper-maven-plugin超える追加の構成が必要になるため理想的ではありません。

追加のソース フォルダーを自動的に構成するモジョを作成したいと考えています。

これが私が作成したモジョですが、モジョが適切なタイミングで確実に実行されるようにする方法がわかりません。

/**
 * @goal add-groovy-source
 * @phase generate-sources
 * @requiresDependencyResolution compile
 * @execute phase="compile"
 */
public class AddGroovySourceFolders extends AbstractMojo {
    /**
     * @parameter expression="${project}"
     * @required
     * @readonly
     */
    private MavenProject project;

    public void execute() throws MojoExecutionException, MojoFailureException {
        getLog().info("Adding /src/main/groovy to the list of source folders");
        this.project.addCompileSourceRoot(project.getBasedir() + "/src/main/groovy");
    }
}

繰り返しますが、私の目標は、ユーザーの pom で最小限の構成を確保することです。これは、この mojo を含むプラグインへの依存関係の宣言のみが存在し、それ以上の構成が存在しないことを意味します。

4

1 に答える 1

2

カスタムライフサイクルを定義することで可能です。

ステップ 1: MOJO を定義してパスを追加します。これはすでに で行いAddGroovySourceFoldersました。

ステップ 2: でMETA-INF/plexus/components.xmlファイルを作成しますsrc/main/resources

<component-set>
    <components>
        <component>
            <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
            <role-hint>jar</role-hint>
            <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
            <configuration>
                <lifecycles>
                    <lifecycle>
                        <id>default</id>

                        <phases>
                            <!-- I added this one, use appropriate plugin groupId/artifactId instead-->
                            <initialize>groovyadd:maven-groovyadd-plugin:add-build-paths</initialize>
                            <process-resources>org.apache.maven.plugins:maven-resources-plugin:2.4.3:resources</process-resources>
                            <compile>org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile</compile>
                            <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:2.4.3:testResources</process-test-resources>
                            <test-compile>org.apache.maven.plugins:maven-compiler-plugin:2.3.2:testCompile</test-compile>
                            <test>org.apache.maven.plugins:maven-surefire-plugin:2.7.2:test</test>
                            <package>org.apache.maven.plugins:maven-jar-plugin:2.3.1:jar</package>
                            <install>org.apache.maven.plugins:maven-install-plugin:2.3.1:install</install>
                            <deploy>org.apache.maven.plugins:maven-deploy-plugin:2.5:deploy</deploy>
                        </phases>
                    </lifecycle>
                </lifecycles>
            </configuration>
        </component>
    </components>
</component-set>

この要素は、ライフサイクルの対象となるパッケージを指定します。どうやらライフサイクルをオーバーライドできるようですjar(Maven 3.0.3 で動作するようになりました)。maven-core-3.0.3.jar\META-INF\plexus\components.xml の適切なコンポーネントから初期化フェーズ以外のすべてをコピーしました。

Maven の JAR ライフサイクルをオーバーライドすることの副作用は、Maven にあるものではなく、プラグインにあるコンパイルおよび他のプラグインのバージョンをハードコーディングしたことです。それが悪いことなのか良いことなのか、私にはわかりません。

ステップ 3: 別のプロジェクトからプラグインを使用する場合、必要なのは次のとおりです。

<plugins>
    ...
    <plugin>
        <groupId>groovyadd</groupId>
        <artifactId>maven-groovyadd-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <extensions>true</extensions>
    </plugin>
    ...
</plugins>

重要な部分は拡張要素です。これがないと、プラグインからのカスタム ライフサイクルが取得されません。

ライフサイクルの他のフェーズに他のプラグインを追加することもできます (たとえば、maven-compiler-plugin のコンパイラを追加するのではなく、別のプラグインのコンパイル フェーズで groovy コードをコンパイルします)。

参考文献: Maven ブックのデフォルト ライフサイクルのオーバーライド

于 2011-12-08T05:09:31.240 に答える