10

在你问为什么我可以只生成一个进程来执行 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 执行这样的构建?

4

3 回答 3

3

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

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

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

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

于 2013-01-11T12:14:26.190 回答
1

Internet 搜索如何使用 API 进行 Maven 构建总是将我带到这里,所以我想记录一下我是如何解决这个问题的。不要直接使用 DefaultMaven。相反,使用 maven-verifier 项目:

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

然后您可以使用 Verifier 类来构建项目。唯一的问题是传递正确的环境变量:

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 中创建了一个带有 maven 输出的 log.txt 文件。

希望这可以帮助!

于 2020-02-11T12:19:51.137 回答
0

我从来没有真正使用过这个 API,不过看起来很有趣。

我看不到你在哪里设定你的目标?

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

http://maven.apache.org/ref/3.0.3/maven-core/apidocs/org/apache/maven/execution/DefaultMavenExecutionRequest.html#setGoals%28java.util.List%29

于 2013-01-11T10:34:08.773 回答