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 包装器)我有代码。
有人知道这是否可行或受支持吗?
谢谢!
有可能
尽管插件的创建者似乎不直接支持该方面,您可以使用调用程序的方法 setMavenExecutable
和 setMavenHome
。
有两种方法可以实现:
使用 Maven Wrapper 脚本的绝对路径
Invoker invoker = new DefaultInvoker();
invoker.setMavenHome(Path.of(".").toFile());
invoker.setMavenExecutable(new File("/home/user/projects/sample/mvnw"));
使用 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
.
我使用 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 包装器)我有代码。
有人知道这是否可行或受支持吗?
谢谢!
有可能
尽管插件的创建者似乎不直接支持该方面,您可以使用调用程序的方法 setMavenExecutable
和 setMavenHome
。
有两种方法可以实现:
使用 Maven Wrapper 脚本的绝对路径
Invoker invoker = new DefaultInvoker(); invoker.setMavenHome(Path.of(".").toFile()); invoker.setMavenExecutable(new File("/home/user/projects/sample/mvnw"));
使用 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
.