我有一个多模块Maven项目(https://github.com/veniltonjr/msplearning)
我的一个模块 我需要以编程方式运行来自Maven的命令构建“clean install ”,但是当我调用这些目标的执行时,会发生以下错误:< / p>
java.lang.IllegalStateException:
未指定Maven应用程序目录,系统属性中未提供$ {maven.home}。请至少详细说明。
在Maven Invoker文档中说M2_HOME环境变量必须存在。
已经在我的SO中设置了这个变量。这不足以使方法invoke
有效吗?按照我运行相关方法的代码段:
Invoker invoker = new DefaultInvoker();
invoker.setLocalRepositoryDirectory(new File("C:\\git\\msplearning"));
InvocationRequest request = new DefaultInvocationRequest();
request.setGoals(Arrays.asList("clean", "install"));
InvocationResult result = invoker.execute(request); // Exception occours here...
已经,谢谢!
已编辑(解决方案)
我必须设置POM并设置Maven Home,在我的情况下是在M3_HOME环境变量中:
InvocationRequest request = new DefaultInvocationRequest();
request.setPomFile(new File("C:\\git\\msplearning\\pom.xml"));
request.setGoals(Collections.singletonList("verify"));
Invoker invoker = new DefaultInvoker();
invoker.setMavenHome(new File(System.getenv("M3_HOME")));
InvocationResult result = invoker.execute(request);
感谢@RobertScholte和@khmarbaise!
答案 0 :(得分:2)
设置request.pomFile
或request.baseDirectory
,以便Invoker知道应该执行Apache Maven的目录或文件。
答案 1 :(得分:0)
如果您正在通过Maven-Surefire单元测试运行,则最好要求Surefire将maven.home
系统属性传递给其子进程。对于https://maven.apache.org/shared/maven-invoker/usage.html,您可以通过添加以下配置节来做到这一点:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version> <!-- see surefire-page for available versions -->
<configuration>
<systemPropertyVariables>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
...
</build>
...
</project>