如何以编程方式调用maven依赖插件 [英] How to programatically invoke a maven dependency plugin

查看:390
本文介绍了如何以编程方式调用maven依赖插件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图以编程方式调用maven-dependency-plugin。我正在使用maven 3版本。问题是,当我通过pluginManager.executeMojo(会话,执行)调用它时,我收到以下错误消息:

I am trying to invoke maven-dependency-plugin programatically. i am using maven 3 version. the problem is that when i invoke it through pluginManager.executeMojo(session, execution), i receive the following error message:

[ERROR] **The parameters 'project', 'local', 'remoteRepos',
'reactorProjects' for goal
org.apache.maven.plugins:maven-dependency-plugin:2.1:unpack are
missing or invalid**
**org.apache.maven.plugin.PluginParameterException: The parameters 'project',
'local', 'remoteRepos', 'reactorProjects' for goal
org.apache.maven.plugins:maven-dependency-plugin:2.1:unpack are missing or
invalid**
        at org.apache.maven.plugin.internal.DefaultMavenPluginManager
        .populatePluginFields(DefaultMavenPluginManager.java:518)
        at org.apache.maven.plugin.internal.DefaultMavenPluginManager
        .getConfiguredMojo(DefaultMavenPluginManager.java:471)
        at org.apache.maven.plugin.DefaultBuildPluginManager
        .executeMojo(DefaultBuildPluginManager.java:99)
        at com.sap.ldi.qi.osgi.OSGiManifesrMfHandlerMojo
        .invokeMavenDependencyPlugin(OSGiManifesrMfHandlerMojo.java:139)
        at com.sap.ldi.qi.osgi.OSGiManifesrMfHandlerMojo
        .execute(OSGiManifesrMfHandlerMojo.java:100)
        at org.apache.maven.plugin.DefaultBuildPluginManager
        .executeMojo(DefaultBuildPluginManager.java:110)
        at org.apache.maven.lifecycle.internal.MojoExecutor
        .execute(MojoExecutor.java:144)
        at org.apache.maven.lifecycle.internal.MojoExecutor
        .execute(MojoExecutor.java:87)
        at org.apache.maven.lifecycle.internal.MojoExecutor
        .execute(MojoExecutor.java:79)
-- many lines stripped from stack trace --
[INFO] ----------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ----------------------------------------------------------------------
[INFO] Total time: 17.938s
[INFO] Finished at: Mon Nov 22 10:27:42 EET 2010
[INFO] Final Memory: 12M/23M
[INFO] ----------------------------------------------------------------------
[ERROR] Failed to execute goal
com.sap.ldi.qi:osgi-manifest-handler-plugin:0.0.1-SNAPSHOT:handle
(osgi-manifest-handler plugin) on project com.sap.ldi.demo.calc
.cmd.tests: The parameters 'project', 'local', 'remoteRepos',
'reactorProjects' for goal
org.apache.maven.plugins:maven-dependency-plugin:2.1:unpack are missing
or invalid -> [Help 1]
-- stripped rest --

据我所知,唯一需要的maven依赖插件的解包目标的参数是artifactItems。我使用PluginExecution.setConfiguration()方法设置插件配置。看来这个插件配置没有正确设置。
你知道为什么抛出这个异常吗?

As I know, the only required parameter for the unpack goal of maven dependency plugin is artifactItems. I set the plugin configuration by using PluginExecution.setConfiguration() method. It seems that this plugin configuration is not correctly set. Do you have any idea why this exception is thrown?

这是我正在使用的配置:

Here is the configuration that I am using:

<configuration>
  <artifactItems>
    <artifactItem>
      <groupId>com.sap.ldi.demo.calc</groupId>
      <artifactId>com.sap.ldi.demo.calc.cmd</artifactId>
      <version>0.1.2-SNAPSHOT</version>
      <type>jar</type>
      <overWrite>true</overWrite>
      <outputDirectory>target/demo-calc-stuff</outputDirectory>
      <includes>**/*.*</includes>
    </artifactItem>
  </artifactItems>
</configuration>

谢谢

我身边的一次纠正。使用的Maven版本不是Maven 3.0,而是Maven 3.0-beta-1。我看到版本3.0-beta-1中的 BuildPluginManager.loadPlugin()有两个args,3.0版本中的相同方法有三个。
我想知道,有没有人试图用maven 3.0或maven 3.0-beta-1以编程方式调用maven插件。我仍然试图用maven 3.0-beta-1调用它,但它仍然返回与上面粘贴的相同的异常。

One correction from my side. The used Maven version is not Maven 3.0 but Maven 3.0-beta-1. I see that BuildPluginManager.loadPlugin() in version 3.0-beta-1 has two args, and the same method in version 3.0 has three. I am wondering, does anyone tried to invoke a maven plugin programatically with maven 3.0 or maven 3.0-beta-1. I am still trying to invoke it with maven 3.0-beta-1, but it still returns the same exception as pasted above.

推荐答案

以下是为Maven 3设计的Mojo Executor的更新版本:

Here is an updated version of Mojo Executor designed for Maven 3:

package com.googlecode.boostmavenproject;

import java.util.Collections;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.util.xml.Xpp3DomUtils;
import org.sonatype.aether.repository.RemoteRepository;

/**
 * Executes an arbitrary mojo using a fluent interface.  This is meant to be executed within the context of a Maven 2
 * mojo.
 *
 * Here is an execution that invokes the dependency plugin:
 * <pre>
 * executeMojo(
 *              plugin(
 *                      groupId("org.apache.maven.plugins"),
 *                      artifactId("maven-dependency-plugin"),
 *                      version("2.0")
 *              ),
 *              goal("copy-dependencies"),
 *              configuration(
 *                      element(name("outputDirectory"), "${project.build.directory}/foo")
 *              ),
 *              executionEnvironment(
 *                      project,
 *                      session,
 *                      pluginManager
 *              )
 *          );
 * </pre>
 * @see http://code.google.com/p/mojo-executor/
 */
public class MojoExecutor
{
    /**
     * Entry point for executing a mojo
     *
     * @param plugin The plugin to execute
     * @param goal The goal to execute
     * @param configuration The execution configuration
     * @param env The execution environment
     * @throws MojoExecutionException If there are any exceptions locating or executing the mojo
     */
    public static void executeMojo(Plugin plugin, String goal, Xpp3Dom configuration,
                                                                 ExecutionEnvironment env) throws MojoExecutionException
    {
        if (configuration == null)
            throw new NullPointerException("configuration may not be null");
        try
        {
            MavenSession session = env.getMavenSession();

            PluginDescriptor pluginDescriptor = env.getPluginManager().loadPlugin(plugin,
                Collections.<RemoteRepository>emptyList(), session.getRepositorySession());
            MojoDescriptor mojo = pluginDescriptor.getMojo(goal);
            if (mojo == null)
            {
                throw new MojoExecutionException("Could not find goal '" + goal + "' in plugin "
                                                                                 + plugin.getGroupId() + ":"
                                                                                 + plugin.getArtifactId() + ":"
                                                                                 + plugin.getVersion());
            }
            configuration = Xpp3DomUtils.mergeXpp3Dom(configuration,
                toXpp3Dom(mojo.getMojoConfiguration()));
            MojoExecution exec = new MojoExecution(mojo, configuration);
            env.getPluginManager().executeMojo(session, exec);
        }
        catch (Exception e)
        {
            throw new MojoExecutionException("Unable to execute mojo", e);
        }
    }

    /**
     * Converts PlexusConfiguration to a Xpp3Dom.
     *
     * @param config the PlexusConfiguration
     * @return the Xpp3Dom representation of the PlexusConfiguration
     */
    private static Xpp3Dom toXpp3Dom(PlexusConfiguration config)
    {
        Xpp3Dom result = new Xpp3Dom(config.getName());
        result.setValue(config.getValue(null));
        for (String name: config.getAttributeNames())
            result.setAttribute(name, config.getAttribute(name));
        for (PlexusConfiguration child: config.getChildren())
            result.addChild(toXpp3Dom(child));
        return result;
    }

    /**
     * Constructs the {@link ExecutionEnvironment} instance fluently
     * @param mavenProject The current Maven project
     * @param mavenSession The current Maven session
     * @param pluginManager The Build plugin manager
     * @return The execution environment
     * @throws NullPointerException if mavenProject, mavenSession or pluginManager
     *   are null
     */
    public static ExecutionEnvironment executionEnvironment(MavenProject mavenProject,
                                                                                                                    MavenSession mavenSession,
                                                                                                                    BuildPluginManager pluginManager)
    {
        return new ExecutionEnvironment(mavenProject, mavenSession, pluginManager);
    }

    /**
     * Builds the configuration for the goal using Elements
     * @param elements A list of elements for the configuration section
     * @return The elements transformed into the Maven-native XML format
     */
    public static Xpp3Dom configuration(Element... elements)
    {
        Xpp3Dom dom = new Xpp3Dom("configuration");
        for (Element e: elements)
            dom.addChild(e.toDom());
        return dom;
    }

    /**
     * Defines the plugin without its version
     * @param groupId The group id
     * @param artifactId The artifact id
     * @return The plugin instance
     */
    public static Plugin plugin(String groupId, String artifactId)
    {
        return plugin(groupId, artifactId, null);
    }

    /**
     * Defines a plugin
     * @param groupId The group id
     * @param artifactId The artifact id
     * @param version The plugin version
     * @return The plugin instance
     */
    public static Plugin plugin(String groupId, String artifactId, String version)
    {
        Plugin plugin = new Plugin();
        plugin.setArtifactId(artifactId);
        plugin.setGroupId(groupId);
        plugin.setVersion(version);
        return plugin;
    }

    /**
     * Wraps the group id string in a more readable format
     * @param groupId The value
     * @return The value
     */
    public static String groupId(String groupId)
    {
        return groupId;
    }

    /**
     * Wraps the artifact id string in a more readable format
     * @param artifactId The value
     * @return The value
     */
    public static String artifactId(String artifactId)
    {
        return artifactId;
    }

    /**
     * Wraps the version string in a more readable format
     * @param version The value
     * @return The value
     */
    public static String version(String version)
    {
        return version;
    }

    /**
     * Wraps the goal string in a more readable format
     * @param goal The value
     * @return The value
     */
    public static String goal(String goal)
    {
        return goal;
    }

    /**
     * Wraps the element name string in a more readable format
     * @param name The value
     * @return The value
     */
    public static String name(String name)
    {
        return name;
    }

    /**
     * Constructs the element with a textual body
     * @param name The element name
     * @param value The element text value
     * @return The element object
     */
    public static Element element(String name, String value)
    {
        return new Element(name, value);
    }

    /**
     * Constructs the element containg child elements
     * @param name The element name
     * @param elements The child elements
     * @return The Element object
     */
    public static Element element(String name, Element... elements)
    {
        return new Element(name, elements);
    }

    /**
     * Element wrapper class for configuration elements
     */
    public static class Element
    {
        private final Element[] children;
        private final String name;
        private final String text;

        public Element(String name, Element... children)
        {
            this(name, null, children);
        }

        public Element(String name, String text, Element... children)
        {
            this.name = name;
            this.text = text;
            this.children = children;
        }

        public Xpp3Dom toDom()
        {
            Xpp3Dom dom = new Xpp3Dom(name);
            if (text != null)
            {
                dom.setValue(text);
            }
            for (Element e: children)
            {
                dom.addChild(e.toDom());
            }
            return dom;
        }
    }

    /**
     * Collects Maven execution information
     */
    public static class ExecutionEnvironment
    {
        private final MavenProject mavenProject;
        private final MavenSession mavenSession;
        private final BuildPluginManager pluginManager;

        public ExecutionEnvironment(MavenProject mavenProject, MavenSession mavenSession,
                                                                BuildPluginManager pluginManager)
        {
            if (mavenProject == null)
                throw new NullPointerException("mavenProject may not be null");
            if (mavenSession == null)
                throw new NullPointerException("mavenSession may not be null");
            if (pluginManager == null)
                throw new NullPointerException("pluginManager may not be null");
            this.mavenProject = mavenProject;
            this.mavenSession = mavenSession;
            this.pluginManager = pluginManager;
        }

        public MavenProject getMavenProject()
        {
            return mavenProject;
        }

        public MavenSession getMavenSession()
        {
            return mavenSession;
        }

        public BuildPluginManager getPluginManager()
        {
            return pluginManager;
        }
    }
}

我会尝试贡献我的更改回官方Mojo Executor插件。

I will attempt to contribute my changes back into the official Mojo Executor plugin.

这篇关于如何以编程方式调用maven依赖插件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆