2010-11-22 12 views
6

Estoy intentando invocar maven-dependency-plugin programáticamente. Estoy usando la versión de maven 3. el problema es que cuando invoco a través pluginManager.executeMojo (sesión, ejecución), aparece el siguiente mensaje de error:Cómo invocar programáticamente un complemento de dependencia maven

[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 -- 

que yo sepa, el único parámetro necesario para el objetivo de desempaquetado de Maven plugin de dependencia es artifactItems . Establecí la configuración del complemento mediante el método PluginExecution.setConfiguration(). Parece que esta configuración de complemento no está configurada correctamente. ¿Tiene alguna idea de por qué se lanza esta excepción?

Aquí es la configuración que estoy usando:

<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> 

Gracias


Una corrección de mi lado. La versión usada de Maven no es Maven 3.0 sino Maven 3.0-beta-1. Veo que BuildPluginManager.loadPlugin() en la versión 3.0-beta-1 tiene dos argumentos, y el mismo método en la versión 3.0 tiene tres. Me pregunto si alguien intentó invocar un plugin maven programáticamente con maven 3.0 o maven 3.0-beta-1. Todavía estoy tratando de invocarlo con maven 3.0-beta-1, pero todavía devuelve la misma excepción que se pegó anteriormente.

Respuesta

0

Los complementos de Maven no se deben invocar mediante programación.

Se basan en los valores que se inyectan en el contenedor del plexo subyacente.

Así que o bien tendrá que averiguar cómo inyectar esos valores o tendrá que confiar en el mecanismo predeterminado.

Una cosa que puede usar es el Maven Invoker. Con eso, puede lanzar programáticamente ciclos de vida maven, pero se ejecutarán en una máquina virtual separada. Entonces, si necesita cambiar el modelo dinámicamente de antemano, necesitará serializar el modelo a un pom.xml temporal y usarlo con maven invocador. Esto es algo pesado, pero lo he logrado con éxito hace unos dos años.

+1

Pensé que BuildPluginManager.executeMojo() está destinado a tales casos de uso. También encontré el siguiente enlace, que explica cómo invocar los plugins de maven programáticamente: http://code.google.com/p/mojo-executor/ – moisko

+0

Parece que la implementación utilizada es para maven 2, pero Don Brown está utilizando la misma idea que se explicó anteriormente – moisko

+0

http://stackoverflow.com/questions/526733/maven-plugin-executing- otro complemento: ese es el enlace al que me refiero. – moisko

2

Gente, creo que lo entiendo. El problema no está en la versión de Maven que estoy usando. Está en la configuración que estoy usando para invocar maven-dependency-plugin. El objetivo de desempaquetado de maven-dependencia-plugin requiere los siguientes parámetros: artifactItems, locales, proyecto, reactorProjects y remoteRepos. Esta es la versión correcta de la configuración utilizada para invocar el plugin:

<configuration> 
    <artifactItems> 
    <artifactItem> 
     <groupId>com.sap.ldi.demo.calc</groupId> 
     <artifactId>com.sap.ldi.demo.calc.cmd</artifactId> 
     <version>0.1.3-SNAPSHOT</version> 
     <type>jar</type> 
     <overWrite>true</overWrite> 
     <outputDirectory>target/demo-calc-stuff</outputDirectory> 
     <includes>**/*.*</includes> 
    </artifactItem> 
    </artifactItems> 
    <local>${localRepository}</local> 
    <project>${project}</project> 
    <reactorProjects>${reactorProjects}</reactorProjects> 
    <remoteRepos>${project.remoteArtifactRepositories}</remoteRepos> 
</configuration>` 
+0

wow, se ve bien (+1) –

+0

El problema es que Maven le dice que no está utilizando el conjunto completo de argumentos necesarios para invocar maven-dependency-plugin: descomprimir, pero no es tan fácil encontrar cuáles son los valores posibles de estos elementos de etiqueta. Tuve que invocar el complemento a través del pom.xml en modo de depuración para encontrar estos valores y construir la configuración. – moisko

10

Aquí está una versión actualizada de Mojo Ejecutor diseñado para 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; 
     } 
    } 
} 

voy a tratar de contribuir con mis cambios de nuevo en el complemento oficial Mojo Executor.

+6

Soy el actual mantenedor de la biblioteca Mojo Executor. Gili se puso en contacto conmigo para informarme sobre su versión parchada. Esto ahora se ha incorporado a la rama principal del proyecto en https://github.com/TimMoore/mojo-executor y se ha implementado como la versión 2.0-INSTANTÁNEA . Si algún usuario de Maven 3 pudiera probarlo y avisarme si hay algún problema (preferiblemente al presentar problemas en el sitio de GitHub), sería realmente útil. ¡Gracias! –

+0

Sí, el plugin Mojo Executor es genial! – JodaStephen

+0

@Gili Hola, ¿podrían decirme cómo puedo inicializar estos campos? MavenProject mavenProject; MavenSession mavenSession; BuildPluginManager pluginManager; –

Cuestiones relacionadas