从一个" meta mojo"执行多个mojos和参数共享

时间:2013-10-30 08:43:07

标签: dependency-injection maven-plugin

我创建了一个带有一些mojos的maven-plugin,每个都有一个非常特殊的目的。但对于最终用户来说,一次执行其中一些会很好(顺序是至关重要的)。

那么如何从mojos执行其他mojos?正在执行的mojos有一些@Parameter字段。所以我不能简单new MyMojo().execute

我的第二个问题是:有没有办法在Mojos之间共享一些@Parameters,或者我必须在每个使用它们的Mojo中声明“@Parameter”? 我的想法是通过实用程序类以某种方式提供所有共享参数,为getter提供参数。

我认为这两个问题的答案都在于理解maven-mojos背后的DI机制?!我对Guice有一些经验,但对Plexus没有经验。那么有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:3)

我不确切知道你的第二个问题意味着什么。也许他们并没有真正相关。但我试着从第一个开始回答这两个问题。

问题1:如何从其他目标调用目标?

为此,您可以使用Apache Maven Invoker

  1. 将Maven依赖项添加到您的插件中 例如:

    <dependency>
        <groupId>org.apache.maven.shared</groupId>
        <artifactId>maven-invoker</artifactId>
        <version>2.2</version>
    </dependency>
    
  2. 然后你可以用这种方式打另一个目标:

    // 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);
    
  3. 问题2:如何在mojos之间共享参数?

    你的意思是:

    1. 如何在一个插件内的多个目标之间共享参数?(参见&#34;问题2.1和#34的答案;)
    2. 如何重复使用&#34; meta mojo&#34;的参数。对于已执行的儿童mojos&#34;?(参见&#34;回答问题2.2&#34;)
    3. 回答问题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的回答中提出解决方案。如果你想在你的&#34; meta mojo&#34;中执行多个目标。您可以重复使用properties变量。