使用Maven 3 API进行编程构建



在您问为什么我可以生成一个进程来执行mvn之前,我希望通过Maven API执行一个Maven构建,这样我就可以收集关于构建中发生的事情、生成的工件等的信息。在依赖org.apache.maven:maven-core:jar:3.0.4之后,我写了下面的方法来尝试做这样的事情:

public static void build(File directory, File pom) {
    Maven maven = new DefaultMaven();
    MavenExecutionRequest exec = new DefaultMavenExecutionRequest();
    exec.setBaseDirectory(directory);
    exec.setPom(pom);
    MavenExecutionResult result = maven.execute(exec);
    MavenProject proj = result.getProject();
    Artifact art = proj.getArtifact();
    System.out.println(art);
}

然而,由于空指针异常,此代码在maven.execute处失败。这些空指针异常基本上无处不在,由于DefaultMaven中的私有字段没有被初始化。它们都有@Required注释,所以我猜这和Plexus有关。

我怎样才能成功地使用Maven来执行这样的构建?

您需要使用实际的Maven嵌入API:

http://maven.apache.org/ref/3.0/maven-embedder/apidocs/index.html

要查看示例,请查看M2Eclipse的开放源代码。

现在,这个组件的名字并不是很好。它实际上是一个旨在创建CLI的便利包装器。所以你要做的就是读取它的来源

互联网搜索如何使用API进行Maven构建总是导致我在这里,所以我想记录我是如何解决这个问题的。不要直接使用DefaultMaven。相反,使用maven-验证器项目:

<dependency>
    <groupId>org.apache.maven.shared</groupId>
    <artifactId>maven-verifier</artifactId>
    <version>1.6</version>
</dependency>

然后您可以使用验证器类来构建一个项目。唯一需要注意的是传递适当的环境变量:

String baseDir = "<root path of the maven project you want to build>";
Map<String,String> env=new HashMap<>();
env.put("maven.multiModuleProjectDirectory", baseDir);
try {
    Verifier v=new Verifier(baseDir);
    v.executeGoals(Arrays.asList("clean","package"),env);
} catch (Exception e) {
    e.printStackTrace();
}

这导致我正在构建项目,并且在baseDir中创建了一个log.txt文件,其中包含maven的输出。

希望这对你有帮助!

我从未真正使用过这个API,尽管看起来很有趣。

我看不出你的目标在哪里?

您可能需要在Maven执行请求上调用:setGoals

http://maven.apache.org/ref/3.0.3/maven-core/apidocs/org/apache/maven/execution/DefaultMavenExecutionRequest.html setGoals % 28并不知道% 29日

最新更新