gpt4 book ai didi

dependency-injection - 从一个 "meta mojo"和参数共享执行多个 mojo

转载 作者:行者123 更新时间:2023-12-04 20:44:52 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

我不知道你的第二个问题是什么意思。也许他们真的没有关系。但我尝试从第一个开始回答这两个问题。

问题 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 的答案”)
  • 如何为执行的“子 mojo”重用“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 的回答中找到解决方案。如果你想在你的“元魔力”中执行多个目标,你可以重复使用 properties多变的。

    关于dependency-injection - 从一个 "meta mojo"和参数共享执行多个 mojo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19677499/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com