Maven 调用程序 - 使用 MVNW

Maven Invoker - Using MVNW

我使用 Maven 调用程序以编程方式编译生成的源代码。
我现在在容器内工作,我也想避免嵌入 MAVEN
目前的代码(在本地运行)一般是这样的(我稍微简化了一下):

InvocationRequest request = new DefaultInvocationRequest();
request.setPomFile(new File("pom.xml"));
 
request.setGoals(Collections.singletonList("test"));
Invoker invoker = new DefaultInvoker();
invoker.setMavenHome(new File(System.getenv("M2_HOME")));
try {
    invoker.execute(request);
} catch (MavenInvocationException e) {
    e.printStackTrace();
}

我想将调用程序重定向到 MVNW(Maven 包装器)我有代码。
有人知道这是否可行或受支持吗?

谢谢!

有可能

尽管插件的创建者似乎不直接支持该方面,您可以使用调用程序的方法 setMavenExecutablesetMavenHome。 有两种方法可以实现:

  1. 使用 Maven Wrapper 脚本的绝对路径

    Invoker invoker = new DefaultInvoker();
    invoker.setMavenHome(Path.of(".").toFile());
    
    invoker.setMavenExecutable(new File("/home/user/projects/sample/mvnw"));
    
  2. 使用 Maven Wrapper 脚本的相对路径

    Invoker invoker = new DefaultInvoker();
    invoker.setMavenHome(Path.of(".").toFile());
    
    invoker.setMavenExecutable(new File("../mvnw"));
    

如果 MVNW 脚本的路径是绝对路径,您可以毫无问题地设置可执行文件。

当它是相对的时,插件的内部将尝试在 <M2_HOME>/bin/ 路径之前添加 - 你必须在声明可执行文件位置时跳过 (../) 一个父文件夹(因此最终路径插件看到的看起来像 <M2_HOME>/bin/../mvnw).

至于 M2_HOME - 由于插件要求,您也必须通过 API 进行设置。如果您不配置它,将引发异常:

Maven application directory was not specified, and ${maven.home} is not provided in the system properties. Please specify at least on of these.

谢天谢地,您可以安全地将它设置到您的项目目录,因为 since Maven 3.5.0 M2_HOME env is not necessary anymore.

如果您的 MVNW 脚本没有放在项目的主目录下,您必须适当地配置路径。

在写这个答案时我使用了 maven-invoker:3.0.1.