2010-01-27 10 views
13

Estoy usando Maven en el contexto de otra herramienta de construcción (leiningen para Clojure, pero esto no debería importar), y me gustaría saber cómo llamaría a un complemento como dependency:build-classpath programáticamente (es decir, a través de Maven-API, no a través del comando mvn).Cómo programar una tarea Maven

Respuesta

3

Vea cómo se implementa org.apache.maven.plugin.testing.AbstractMojoTestCase de maven-plugin-testing-arnés. Aquí hay un fragmento de código de algunas de mis pruebas que puede ser útil.

public abstract class JAXBGenerateTest extends AbstractMojoTestCase { 

    static { 
     System.setProperty("basedir", getBaseDir().getAbsolutePath()); 
    } 

    protected MavenProjectBuilder mavenProjectBuilder; 

    protected void setUp() throws Exception { 
     super.setUp(); 

     mavenProjectBuilder = (MavenProjectBuilder) getContainer().lookup(
       MavenProjectBuilder.ROLE); 
    } 

    protected static File getBaseDir() {...} 

    /** 
    * Validate the generation of a java files from purchaseorder.xsd. 
    * 
    * @throws MojoExecutionException 
    */ 
    public void testExecute() throws Exception { 

     final File pom = new File(getBaseDir(), 
     "src/test/resources/test-pom.xml"); 

     final ArtifactRepository localRepository = new DefaultArtifactRepository("local", 

       new File(getBaseDir(), "target/test-repository").toURI().toURL().toString()    , new DefaultRepositoryLayout()); 


     final MavenProject mavenProject = mavenProjectBuilder.build(pom, localRepository, null); 


     final XJC2Mojo generator = (XJC2Mojo) lookupMojo("generate", pom); 
     generator.setProject(mavenProject); 
     generator.setLocalRepository(localRepository); 
     generator.setSchemaDirectory(new File(getBaseDir(),"src/test/resources/")); 
     generator.setSchemaIncludes(new String[] { "*.xsd" }); 
     generator.setBindingIncludes(new String[] { "*.xjb" }); 
     generator.setGenerateDirectory(new File(getBaseDir(), "target/test/generated-sources")); 
     generator.setVerbose(true); 
     generator.setGeneratePackage("unittest"); 
     generator.setRemoveOldOutput(false); 

     generator.execute(); 
    } 

} 
7

Aquí es una solución mejor: utilizar la biblioteca Mojo-Executor. Expone una API Java simple para invocar plugins Maven.

+0

esto sólo reemplaza la necesidad de ejecutar un plugin de Maven con la necesidad de ejecutar otro Maven Plugin. –

+0

@JensSchauder: No, no es así. Mojo-Executor proporciona una API simple de Java que invoca los complementos de Maven en su nombre. ¡Invocar plugins Maven directamente requiere mucho trabajo pesado! – Gili

+0

Ok, eso no estaba claro desde la página del proyecto para mí. –

13

Utilice Maven Invoker API. Es rápido y fácil.

InvocationRequest request = new DefaultInvocationRequest(); 
request.setPomFile(new File("/path/to/pom.xml")); 
request.setGoals(Collections.singletonList("install")); 

Invoker invoker = new DefaultInvoker(); 
invoker.setMavenHome(new File("/usr")); 

try 
{ 
    invoker.execute(request); 
} 
catch (MavenInvocationException e) 
{ 
    e.printStackTrace(); 
} 

pom.xml:

<dependency> 
    <groupId>org.apache.maven.shared</groupId> 
    <artifactId>maven-invoker</artifactId> 
    <version>2.1.1</version> 
</dependency> 
+0

Eso está bifurcando un nuevo ciclo de vida. TFQ está intentando invocar un mojo dentro del ciclo de vida actual. –

Cuestiones relacionadas