Я использую Maven в контексте другого инструмента построения (leiningen для Clojure, но это не имеет значения), и я хотел бы знать, как я бы назвал плагин как зависимость: build-classpath программно (т.е. через Maven-API, а не с помощью команды mvn
).
Как программно вызывать задачу Maven
Ответ 1
Посмотрите, как реализуется org.apache.maven.plugin.testing.AbstractMojoTestCase из maven-plugin-test-harness. Вот фрагмент кода из некоторых моих тестов, которые могут быть полезны.
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();
}
}
Ответ 2
Используйте Maven Invoker API. Его быстро и легко.
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>
Ответ 3
Здесь лучшее решение: используйте библиотеку Mojo-Executor. Он предоставляет простой Java API для вызова плагинов Maven.
Ответ 4
Ant Задачи Maven могут дать вам представление о том, как это сделать (DependenciesTask source). Другим маршрутом может быть PomModuleDescriptorParser, используемый Ivy.