【问题标题】:Execute multiple mojos from one "meta mojo" and parameter sharing从一个“元 mojo”和参数共享执行多个 mojo
【发布时间】:2013-10-30 08:43:07
【问题描述】:
我创建了一个带有一些 mojo 的 maven-plugin,每个都有一个非常特殊的用途。但是对于最终用户来说,一次执行其中一些会很好(顺序很重要)。
那么如何从一个 mojos 执行中执行其他 mojos 呢?正在执行的 mojos 有一些 @Parameter 字段。所以我不能简单new MyMojo().execute。
我的第二个问题是:有没有办法在 Mojos 之间共享一些 @Parameters 或者我必须在每个使用它们的 Mojo 中声明“@Parameter”?
我的想法是通过提供 getter 参数的实用程序类以某种方式传递所有共享参数。
我认为这两个问题的答案不知何故在于理解 maven-mojos 背后的 DI 机制?!我对 Guice 有一些经验,但对 Plexus 没有。那么有人可以给我一些建议吗?
【问题讨论】:
标签:
dependency-injection
maven-plugin
【解决方案1】:
我不知道你的第二个问题是什么意思。也许他们并没有真正的关系。但我试着从第一个开始回答。
问题 1:如何从另一个目标调用一个目标?
为此,您可以使用Apache Maven Invoker。
-
将 Maven 依赖项添加到您的插件中。
例如:
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-invoker</artifactId>
<version>2.2</version>
</dependency>
-
然后你可以这样调用另一个目标:
// parameters:
final Properties properties = new Properties();
properties.setProperty("example.param.one", exampleValueOne);
// prepare the execution:
final InvocationRequest invocationRequest = new DefaultInvocationRequest();
invocationRequest.setPomFile(new File(pom)); // pom could be an injected field annotated with '@Parameter(defaultValue = "${basedir}/pom.xml")' if you want to use the same pom for the second goal
invocationRequest.setGoals(Collections.singletonList("second-plugin:example-goal"));
invocationRequest.setProperties(properties);
// configure logging:
final Invoker invoker = new DefaultInvoker();
invoker.setOutputHandler(new LogOutputHandler(getLog())); // using getLog() here redirects all log output directly to the current console
// execute:
final InvocationResult invocationResult = invoker.execute(invocationRequest);
问题 2:如何在 mojo 之间共享参数?
你的意思是:
- 如何在一个插件内的多个目标之间共享参数?
(参见“问题 2.1 的答案”)
- 如何为执行的“child mojos”重用“meta mojo”的参数?
(参见“问题 2.2 的答案”)
问题 2.1 的答案:
您可以创建一个包含参数字段的抽象父类。
例子:
abstract class AbstractMyPluginMojo extends Abstract Mojo {
@Parameter(required = true)
private String someParam;
protected String getSomeParam() {
return someParam;
}
}
@Mojo(name = "first-mojo")
public class MyFirstMojo extends AbstractMyPluginMojo {
public final void execute() {
getLog().info("someParam: " + getSomeParam());
}
}
@Mojo(name = "second-mojo")
public class MySecondMojo extends AbstractMyPluginMojo {
public final void execute() {
getLog().info("someParam: " + getSomeParam());
}
}
您可以在几乎所有更大的 maven 插件中找到这种技术。例如查看Apache Maven Plugin sources。
问题 2.2 的答案:
您可以在我对问题 1 的回答中找到解决方案。如果您想在“meta mojo”中执行多个目标,您可以重复使用 properties 变量。