我为maven-compiler-plugin创建了一个新的编译器。这个编译器喜欢在src / main / groovy和src / main / java中查找编译源代码。同样,测试源同时包含src / test / groovy和src / test / java。
我知道build-helper-maven-plugin
允许用户扩充他们的pom以为构建指定新的源文件夹,但使用此插件并不理想,因为它需要超过20 lines of extra configuration in the pom。
我想创建一个自动配置额外源文件夹的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中的最小配置量。我的意思是,应该只对包含此mojo的插件进行依赖声明,而不进行进一步配置。
答案 0 :(得分: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>
重要的部分是 extensions 元素。没有它,您的插件中的自定义生命周期将无法获取。
您还可以将其他插件添加到生命周期的其他阶段(例如,在单独的插件中编译groovy代码,而不是为maven-compiler-plugin添加编译器)。
参考:Maven一书中的Overriding the Default Lifecycle