Maven Invoker:IllegalStateException

时间:2014-01-18 04:57:16

标签: java maven

我有一个多模块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!

2 个答案:

答案 0 :(得分:2)

设置request.pomFilerequest.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>