Sto usando Maven nel contesto di un altro strumento di costruzione (leiningen per Clojure, ma questo non dovrebbe importare), e mi piacerebbe sapere come chiamerei un plugin come dependency:build-classpath programmaticamente (ovvero tramite Maven-API, non tramite il comando mvn
).Come chiamare programmaticamente un'attività Maven
risposta
Vedere come viene implementato org.apache.maven.plugin.testing.AbstractMojoTestCase da maven-plugin-testing-harness. Ecco uno snippet di codice di alcuni dei miei test che potrebbe essere utile.
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();
}
}
Il Ant Maven tasks può darti un'idea su come farlo (DependenciesTask source). Un altro percorso può essere il PomModuleDescriptorParser utilizzato da Ivy.
Ecco una soluzione migliore: utilizzare la libreria Mojo-Executor. Espone una semplice API Java per richiamare i plugin Maven.
Utilizzare Maven Invoker API. È veloce e facile.
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>
Questo sta creando un nuovo ciclo di vita. TFQ sta tentando di richiamare un mojo all'interno del ciclo di vita corrente. –
questo solo elimina la necessità di eseguire un plugin Maven con la necessità di eseguire un altro Maven Plugin. –
@JensSchauder: No, non è così. Mojo-Executor fornisce una semplice API Java che richiama i plugin Maven per tuo conto. Richiamare i plug-in Maven richiede molto lavoro pesante! – Gili
Ok, non era chiaro dalla pagina del progetto per me. –