我最终编写了自己的插件,利用mojo-executor调用其他mojos . 这允许我1)集中构建配置和2)最小化在每个子项目中重复的配置量 .
(如果您对所有这些的原因感到好奇:每个子项目都是一个将从命令行执行的作业 . 该构建设置一个调用者shell脚本并将其附加到构建中,以便将其检入我们的工件中存储库 . 稍后,部署脚本会将这些脚本下载到它们将运行的计算机上 . )
模板项目的相关部分是pom:
...
job-template
pom
job project template
...
job-maven-plugin
generate-sources-step
job-generate-sources
package-step
job-package
... (a couple more executions) ...
不得不创建一个新的maven-plugin项目(job-maven-plugin) . Pom看起来像:
...
job-maven-plugin
maven-plugin
job maven executor plugin
org.twdata.maven
mojo-executor
1.5
从模板项目中可以看出,我的插件中有多个mojos(每个阶段需要一些东西发生) . 例如,作业包mojo绑定到包阶段,并使用mojo-executor库运行另外两个mojos(只附加一些构建工件):
/**
* @goal job-package
* @phase package
*/
public class PackageMojo extends AbstractMojo {
/**
* @parameter expression="${project}"
* @required
* @readonly
*/
protected MavenProject project;
/**
* @parameter expression="${session}"
* @required
* @readonly
*/
protected MavenSession session;
/**
* @component
* @required
*/
protected PluginManager pluginManager;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
ExecutionEnvironment environment = executionEnvironment(project, session, pluginManager);
// Attach script as a build artifact
executeMojo(
plugin(
groupId("org.codehaus.mojo"),
artifactId("build-helper-maven-plugin"),
version("1.7")
),
goal("attach-artifact"),
configuration(
element("artifacts",
element("artifact",
element("file", "${project.build.directory}/script.shl"),
element("type", "shl")
)
)
),
environment
);
// Zip up the jar and script as another build artifact
executeMojo(
plugin(
groupId("org.apache.maven.plugins"),
artifactId("maven-assembly-plugin"),
version("2.3")
),
goal("single"),
configuration(
element("descriptors",
element("descriptor", "${project.build.directory}/job/descriptor.xml")
)
),
environment
);
}
}
然后,在子项目中,我只需要引用一次插件 . 在我看来,这比重复每个子项目中的每个幕后插件(不可接受地增加poms之间的耦合)更为可取 . 如果我想在将来向构建过程添加mojo执行,我只需修改一个地方并修改版本号 . 儿童项目的pom看起来像:
...
job-template
...
../job-template
job-testjob
test job
...
job-maven-plugin
此外,整个multimodule目录结构现在看起来像这样:
+- job
+- job-core
+- job-maven-plugin
+- job-template
+- job-testjob1 (inherits from job-template)
+- job-testjob2 (inherits from job-template)
在我看来,这个解决方案并不是完全最优的,因为我现在将插件配置嵌入到一系列mojos而不是pom中,但它符合我的目标,即集中配置并最大限度地减少子项目poms之间的重复 .
(最后一点说明:我刚刚发现maven-aggregate-plugin似乎允许在pom中对多个插件执行进行分组 . 这可能以稍微更理想的方式解决了问题,但我没心情重做最后一个几个小时的工作 . 虽然可能对别人有益 . )