2

我为 maven-compiler-plugin 创建了一个新的编译器。这个编译器喜欢在 src/main/groovy 和 src/main/java 中寻找编译源。同样,测试源在 src/test/groovy 和 src/test/java 中。

我知道build-helper-maven-plugin允许用户扩充他们的 pom 来为构建指定新的源文件夹,但是使用这个插件并不理想,因为它需要在 pom 中进行超过20 行的额外配置

我想创建一个自动配置额外源文件夹的 mojo。

这是我创建的 mojo,但我不知道如何确保 mojo 在正确的时间执行。

/**
 * @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.xml 中的配置最少。我的意思是,应该只声明包含此 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>

重要的部分是扩展元素。没有它,您的插件的自定义生命周期将不会被拾取。

您还可以将其他插件添加到生命周期中的其他阶段(例如,在单独的插件中的编译阶段编译 groovy 代码,而不是为 maven-compiler-plugin 添加编译器)。

参考:覆盖Maven 书中的默认生命周期

于 2011-12-08T05:09:31.240 回答