Ich benutze Maven im Kontext eines anderen Build-Tools (Leiningen für Clojure, aber das sollte nicht wichtig sein), und ich würde gerne wissen, wie ich ein Plugin wie dependency:build-classpath aufrufen würde programmatisch (dh über die Maven-API, nicht über den mvn
-Befehl).Wie programmgesteuert eine Maven-Task aufrufen
Antwort
Sehen Sie, wie org.apache.maven.plugin.testing.AbstractMojoTestCase von Maven-Plugin-Testing-Kabelbaum implementiert ist. Hier ist ein Codeausschnitt aus einigen meiner Tests, der hilfreich sein kann.
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();
}
}
Die Ant Maven tasks kann Ihnen eine Idee geben, wie es geht (DependenciesTask source). Eine andere Route kann die PomModuleDescriptorParser sein, die von Ivy verwendet wird.
Hier ist eine bessere Lösung: Verwenden Sie die Mojo-Executor Bibliothek. Es stellt eine einfache Java-API zum Aufrufen von Maven-Plugins zur Verfügung.
Verwenden Sie die Maven Invoker API. Es ist schnell und einfach.
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>
Das ist ein neuer Lebenszyklus. TFQ versucht, ein Mojo innerhalb des aktuellen Lebenszyklus aufzurufen. –
diese ersetzt nur die Notwendigkeit, ein Maven Plugin mit der Notwendigkeit zur Ausführung einer anderen Maven Plugin auszuführen. –
@JensSchauder: Nein, tut es nicht. Mojo-Executor bietet eine einfache Java-API, die in Ihrem Namen Maven-Plugins aufruft. Maven Plugins direkt aufrufen erfordert viel schweres Heben! – Gili
Ok, das war nicht klar von der Projektseite für mich. –