【问题标题】:Maven Invoker: IllegalStateExceptionMaven 调用者:IllegalStateException
【发布时间】:2019-11-12 00:57:13
【问题描述】:

我有一个多模块 Maven 项目 (https://github.com/veniltonjr/msplearning)

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

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

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

已经在我的 SO 中设置了这个变量。这应该不足以使方法invoke 工作?遵循我运行相关方法的代码 sn-p:

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!

【问题讨论】:

  • 为什么需要运行这样的命令?根级别的mvn install 不起作用吗?
  • 感谢@khmarbaise 的评论。当我在根级别运行 mvn install 时,构建成功完成。但我需要以编程方式运行此命令,因为我需要在 RESTful 服务中提供输出工件。
  • @veniltonjr 要执行上述代码,您需要在您的机器上安装 Maven 还是只需几个 jar 文件就足够了??
  • 嗨@Lucy!该方案具体使用了服务器上配置的 MV3_HOME 环境变量。因此需要安装 Maven。

标签: java maven


【解决方案1】:

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

【讨论】:

  • 感谢您的回复@RobertScholte!但没有一个选项奏效。你对这个问题还有什么建议吗?在我的父项目(msplearning)的模块之一中的服务ProductRESTfulServer 上执行方法invoke
  • 我认为 Karl-Heinz 提出了正确的问题。 什么你想构建?哪个 pom.xml?
  • 好想建父项目的pom:msplearning/pom.xml
  • 你不会混淆构建时间和运行时间吗?我没有任何理由需要在运行时重建项目。我试图建立你的项目,但我错过了 ANDROID_HOME。几点说明:您的项目只能使用 M3.0.x 构建,而不能使用 M3.1.x+ 构建(但不一定是问题)。并且在开发过程中,版本必须始终使用 -SNAPSHOT。
  • 这意味着您需要该项目的源代码。检出 TMP_android-app 目录中的源代码(例如)或包含 maven.apache.org/plugins/maven-assembly-plugin/… 并将其解压缩到 TMP_android-app 中。现在将 request.baseDir 设置为 TMP_android-app 并运行verify(不是“干净安装”,开销太大)
【解决方案2】:

如果您从 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2012-04-16
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多