Java Maven调用程序:IllegalStateException

Java Maven调用程序:IllegalStateException,java,maven,Java,Maven,我有一个多模块Maven项目() 我的一个模块需要以编程方式运行Maven build“clean install”中的命令,但是当我调用这些目标的执行时,会发生以下错误: java.lang.IllegalStateException:未指定Maven应用程序目录,并且系统属性中未提供${Maven.home}。请至少指定其中一项。 文档中说M2_HOME环境变量必须存在 已在我的SO中设置此变量。这不足以使方法调用工作吗?遵循我运行相关方法的代码段: Invoker invoker = ne

我有一个多模块Maven项目()

我的一个模块需要以编程方式运行Maven build“clean install”中的命令,但是当我调用这些目标的执行时,会发生以下错误:

java.lang.IllegalStateException:
未指定Maven应用程序目录,并且系统属性中未提供${Maven.home}。请至少指定其中一项。

文档中说M2_HOME环境变量必须存在

已在我的SO中设置此变量。这不足以使方法
调用
工作吗?遵循我运行相关方法的代码段:

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);

谢谢@robertscholet和@khmarbaise

设置
request.pomFile
request.baseDirectory
,以便调用者知道应该从哪个目录或文件执行Apache Maven。

如果您是从Maven Surefire单元测试运行,那么最好请求Surefire将
Maven.home
系统属性传递给其子进程。根据,您可以通过添加以下配置节来执行此操作:

<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>

...
org.apache.maven.plugins
maven surefire插件
2.12.4 
${maven.home}
...
...

为什么需要运行这样的命令?
mvn安装在根级别上的
不起作用吗?谢谢@khmarbaise的评论。当我在根级别运行mvn安装时,构建成功完成。但我需要以编程方式运行此命令,因为我需要在RESTful服务中提供输出工件。@veniltonjr要执行上述代码,您的计算机上需要安装Maven还是只需要几个jar文件就足够了?@Hi@Lucy!具体来说,此解决方案使用服务器上配置的MV3_HOME环境变量。因此需要安装Maven。感谢您的回复@robertscholet!但所有的选择都不起作用。你对这个问题还有什么建议吗?对服务执行
invoke
,该服务位于我父项目()的一个模块中。我认为Karl Heinz问的问题是正确的。你想建造什么?哪个pom.xml?我真的很想构建父项目的pom:
msplearning/pom.xml
你不把构建时间和运行时混淆了吗?我不知道为什么需要在运行时重建项目。我试图建立你的项目,但我错过了ANDROID_主页。几句话:您的项目只能使用M3.0.x构建,而不能使用M3.1.x+(不过这不一定是个问题)。在开发过程中,该版本必须始终使用快照。这意味着您需要该项目的源代码。签出到TMP_android-app目录中的源代码(例如),或者将其包含并解压缩到TMP_android-app中。现在将request.baseDir设置为TMP_android-app并运行
verify
(不是“干净安装”,开销太大)