【问题标题】:Maven Invoker - Using MVNWMaven Invoker - 使用 MVNW
【发布时间】:2022-01-05 11:54:53
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: java maven-invoker-plugin


    【解决方案1】:

    有可能

    虽然插件的创建者似乎不直接支持该方面,但您可以配置 Maven Invoker API 以使用 Invoker 的方法 setMavenExecutablesetMavenHome 运行 Maven Wrapper。 有两种方法可以实现:

    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} 是 系统属性中未提供。请至少指定一个 这些。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多