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包装器(
有人知道这是否可能或是否得到支持吗?

谢谢!

这是可能的

尽管插件的创建者似乎不直接支持这一方面,但您可以使用Invoker的方法setMavenExecutablesetMavenHome来配置Maven Invoker API以运行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}为系统属性中未提供。请至少在上指定这些

值得庆幸的是,您可以安全地将其设置到您的项目目录中,因为Maven 3.5.0M2_HOMEenv不再是必需的。

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

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

最新更新