将参数传递给以编程方式调用的 maven mojo

Posted

技术标签:

【中文标题】将参数传递给以编程方式调用的 maven mojo【英文标题】:Pass parameters to a maven mojo invoked programmatically 【发布时间】:2018-01-10 15:59:14 【问题描述】:

这里有我的 Maven Mojo:

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.shared.invoker.*;

import java.util.Collections;

@Mojo(name = "run")
public class RunMojo extends AbstractMojo 

    @Override
    public void execute() throws MojoExecutionException 
        InvocationRequest request = new DefaultInvocationRequest();
        request.setGoals(Collections.singletonList("myplugin:mygoal"));
        
        // need to set parameters to pass to the goal
    
        Invoker invoker = new DefaultInvoker();
        try 
            invoker.execute(request);
         catch (MavenInvocationException e) 
            e.printStackTrace();
        
    

我需要调用第二个 Mojo 传递一些参数,就像我在 pom.xml 中定义插件时所做的那样,如下所示。

<build>
    <plugins>
        <plugin>
            <artifactId>myPlugin</artifactId>
            <groupId>myGroupId</groupId>
            <version>myVersion</version>
            <configuration>
                <param1>value1</param1>
                <param2>value2</param2>
                <param3>value3</param3>
            </configuration>
        </plugin>
    </plugins>
</build>

有什么办法吗?

【问题讨论】:

你能解释一下你想要完成什么吗?或者你想解决什么问题? 我正在开发一个插件,用于管理 Wildfly 服务器上 Java 应用程序的构建和部署(通过 widlfly-maven-plugin)。在某些时候,我需要调用 widlfly-maven-plugin 来启动服务器,但我还需要将所有配置属性传递给它。 【参考方案1】:

这可能是一个较老的问题,但最近发现自己处于这种情况并教我如何创建一个包含另一个插件的新插件。

我最终使用了 mojo-executor 插件 (https://github.com/TimMoore/mojo-executor) 。即使它没有得到积极的维护,它也能很好地完成这项工作。这是我如何从自己的 maven 插件执行 html2pdf-maven-plugin (https://bitbucket.org/prunge/html2pdf-maven-plugin/wiki/Home) 的示例。

generatePdf(...) 方法是从 Mojo 类的 execute() 方法调用的。 getMvnPlugin(...) 方法是我指定插件 groupId 和 ArtifactId 以及执行细节的地方。 getPluginConfiguration(...) 方法是进行插件配置的地方,指定 html2pdf-maven-plugin 的参数。

 private void generatePdf(File inputFilePath, String outputFile) 
    String inputDirectory = inputFilePath.getParent();
    String inputFileName = inputFilePath.getName();

    try 
        Plugin html2pdfPlugin = getMvnPlugin(outputFile, inputFile, inputFileName);

        MojoExecutor.ExecutionEnvironment executionEnvironment = MojoExecutor.executionEnvironment(mavenProject, mavenSession, pluginManager);
        MojoExecutor.executeMojo(html2pdfPlugin, "html2pdf", getPluginConfiguration(outputFile, inputDirectory, inputFileName), executionEnvironment);
     catch (Exception ex) 
        String errorMessage = String.format("Failed to generate PDF file [%s] from html file [%s].", outputFile, inputFile);
        getLog().error(errorMessage, ex);
    


private Plugin getMvnPlugin(String outputFile, String inputDirectory, String inputFileName) 
    Plugin plugin = new Plugin();

    plugin.setGroupId("au.net.causal.maven.plugins");
    plugin.setArtifactId("html2pdf-maven-plugin");
    plugin.setVersion("2.0");

    PluginExecution pluginExecution = new PluginExecution();
    pluginExecution.setGoals(Collections.singletonList("html2pdf"));
    pluginExecution.setId("generate-pdf");
    pluginExecution.setPhase("generate-resources");
    plugin.setExecutions(Collections.singletonList(pluginExecution));

    plugin.setConfiguration(getPluginConfiguration(outputFile, inputDirectory, inputFileName));

    return plugin;


private Xpp3Dom getPluginConfiguration(String outputFile, String inputDirectory, String inputFileName) 
    MojoExecutor.Element outputFileElement = new MojoExecutor.Element("outputFile", outputFile);

    MojoExecutor.Element includeElement = new MojoExecutor.Element("include", "**/" + inputFileName);
    MojoExecutor.Element includesElement = new MojoExecutor.Element("includes", includeElement);
    MojoExecutor.Element directoryElement = new MojoExecutor.Element("directory", inputDirectory);
    MojoExecutor.Element htmlFileSetElement = new MojoExecutor.Element("htmlFileSet", directoryElement, includesElement);
    MojoExecutor.Element htmlFileSetsElement = new MojoExecutor.Element("htmlFileSets", htmlFileSetElement);

    return MojoExecutor.configuration(outputFileElement, htmlFileSetsElement);

只需使用 org.apache.maven.plugins.annotations.Component 将 mavenProject、mavenSession 和 pluginManager 注入 Mojo 类。

@Component
private MavenProject mavenProject;

@Component
private MavenSession mavenSession;

@Component
private BuildPluginManager pluginManager;

【讨论】:

感谢您的回复。最后我避免包装插件。无论如何,当您需要包装另一个插件时,您的解决方案似乎是最干净的。显然,没有办法使用 Maven API 来完成它,而不是依赖第三方库(在这种情况下是 mojo-executor)

以上是关于将参数传递给以编程方式调用的 maven mojo的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从 pom.xml 执行特定的插件/Mojo?

如何将事件处理程序分配给以编程方式创建的图片框

从自定义 mojo 访问 maven 插件的运行时配置的最佳方式?

Maven 和 Java:目标 org.codehaus.mojo:exec-maven-plugin:1.2.1:java 的参数“mainClass”丢失或无效

将未初始化的变量传递给以数组为参数的函数

在 Maven 中从测试范围运行 main:“目标 org.codehaus.mojo:exec-maven-plugin:1.6.0:java 的参数 'mainClass' 丢失或无效”