创建Maven Mojo,自动将新的源文件夹添加到构建中

创建Maven Mojo,自动将新的源文件夹添加到构建中,maven,maven-plugin,mojo,Maven,Maven Plugin,Mojo,我已经为maven编译器插件创建了一个新的编译器。这个编译器喜欢在src/main/groovy和src/main/java中查找编译源代码。类似地,测试源在src/test/groovy和src/test/java中 我知道buildhelpermaven插件,它允许用户扩充pom,为构建指定新的源文件夹,但使用该插件并不理想,因为它需要更多的资源 我想创建一个自动配置额外源文件夹的mojo 这是我创建的魔咒,但我不知道如何确保魔咒在正确的时间执行 /** * @goal add-groov

我已经为maven编译器插件创建了一个新的编译器。这个编译器喜欢在src/main/groovy和src/main/java中查找编译源代码。类似地,测试源在src/test/groovy和src/test/java中

我知道
buildhelpermaven插件
,它允许用户扩充pom,为构建指定新的源文件夹,但使用该插件并不理想,因为它需要更多的资源

我想创建一个自动配置额外源文件夹的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中的配置量最小。我的意思是,应该只声明对包含此mojo的插件的依赖关系,而不进行进一步的配置。

可以通过定义自定义生命周期来实现

步骤1:定义MOJO以添加路径。您已经使用
AddGroovySourceFolders
实现了这一点

步骤2:在
src/main/resources
中创建一个
META-INF/plexus/components.xml
文件:

<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>
重要的部分是extensions元素。没有它,你的插件的自定义生命周期将无法启动

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


参考资料:来自Maven的书

谢谢。我要试试这个。太好了。我开始让事情运转起来。不过,还有几个问题。我不高兴每个阶段的目标都是明确的。我从component.xml中删除了它们,一切似乎都正常。你觉得这有什么问题吗?此外,这些组件特定于jar生命周期。我猜我需要为其他有趣的生命周期(如ear、war、maven插件等)复制一些东西。你有什么办法吗?@AndrewEisenberg删除这些版本意味着我认为插件的最新版本会被选中,这可能是你想要的,也可能不是你想要的。积极的一面是,无论使用的Maven版本是什么,它都能正常工作并使用合理的插件版本。负面的说法是,如果用户有更高版本的编译器插件,那么它将在您的插件处于活动状态时使用,而不是Maven的默认插件。如果您需要支持更多的打包类型(war、ejb等),则需要覆盖每种打包类型的生命周期配置。@AndrewEisenberg可能正是您想要的,但他们没有将其纳入Maven 3.0,他们有可能进入Maven 3.1。谢谢,@prunge。我看到的问题是,如果我使用版本,那么运行(比如)maven 2.x的人仍然会使用适合maven 3.0.3的版本(因为这是在components.xml中指定的)。另外,我想我必须从maven core的components.xml复制一整套生命周期映射。
<plugins>
    ...
    <plugin>
        <groupId>groovyadd</groupId>
        <artifactId>maven-groovyadd-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <extensions>true</extensions>
    </plugin>
    ...
</plugins>