如何以编程方式调用Maven任务

我在另一个构建工具(leiningen for Clojure,但这应该无关紧要)的上下文中使用Maven,我想知道如何调用依赖的插件:build-classpath以编程方式(即通过Maven- API,而不是通过mvn -command)。

了解如何实现maven-plugin-testing-harness中的org.apache.maven.plugin.testing.AbstractMojoTestCase。 这是我的一些测试的代码片段,可能会有所帮助。

 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(); } } 

使用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中:

  org.apache.maven.shared maven-invoker 2.1.1  

这是一个更好的解决方案:使用Mojo-Executor库。 它公开了一个简单的Java API来调用Maven插件。

Ant Maven任务可以让您了解如何执行此操作( DependenciesTask源代码 )。 另一条路线可能是Ivy使用的PomModuleDescriptorParser 。