2

我使用 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 包装器)。
任何人都知道这是否可行或受支持?

谢谢!

4

1 回答 1

1

这是可能的

尽管插件的创建者似乎不直接支持该方面,但您可以配置 Maven Invoker API 以使用 Invoker 的方法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 应用程序目录,并且系统属性中未提供 ${maven.home}。请至少指定其中一项。

幸运的是,您可以安全地将其设置到您的项目目录,因为 Maven 3.5.0M2_HOME不再需要 env 了

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

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

于 2022-01-18T16:57:32.247 回答