Dependency injection 从一个“执行多个MOJO”;“元魔咒”;和参数共享

Dependency injection 从一个“执行多个MOJO”;“元魔咒”;和参数共享,dependency-injection,maven-plugin,Dependency Injection,Maven Plugin,我用一些Mojo创建了一个maven插件,每个插件都有一个非常特殊的用途。但是对于最终用户来说,立即执行其中的一些命令是很好的(顺序是至关重要的) 那么,如何从mojos execute执行其他mojo呢?正在执行的mojo有一些@Parameter字段。所以我不能简单地新建MyMojo()。执行 我的第二个问题是:有没有办法在Mojo之间共享一些@Parameter,或者我必须在使用它们的每个Mojo中声明“@Parameter”? 我的想法是通过提供参数的实用程序类以某种方式传递所有共享参数

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

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

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


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

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

问题1:如何从另一个目标中调用目标?

为此,您可以使用

  • 将Maven依赖项添加到插件中。
    例如:

    <dependency>
        <groupId>org.apache.maven.shared</groupId>
        <artifactId>maven-invoker</artifactId>
        <version>2.2</version>
    </dependency>
    
  • 问题2:如何在MOJO之间共享参数?

    你是说:

  • 如何在一个插件内的多个目标之间共享参数?
    (请参阅“问题2.1的答案”)
  • 如何为已执行的“子mojo”重用“元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插件中找到这种技术。例如,请看下面的例子

    问题2.2的答案:

    你可以在我对问题1的回答中找到解决方案。如果您想在“meta mojo”中执行多个目标,您可以重用
    属性
    变量。

    您尝试过吗
    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());
        }
    }