我正在使用SVNKit API以编程方式检查svn项目后,通过Java代码执行一组maven命令,我面临一些奇怪的问题,如下所述 -
这是我调用maven命令的Java代码 -
public static void runCommand(String mavenCommand, File workingDirectory)
throws IOException {
ProcessBuilder processBuilder = new ProcessBuilder(getMavenCommand(),
"release:prepare");
processBuilder.directory(workingDirectory);
Process process = processBuilder.start();
try {
process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
protected static String getMavenCommand() {
String cmd = (System.getProperty("os.name")
.startsWith("Windows")) ? "mvn.bat" : "mvn";
String mavenHome = "C:/Program Files (x86)/apache-maven-3.2.1/bin/";
return mavenHome + cmd;
}
release:prepare 命令要求用户针对三个问题点击“ENTER” - 标记的名称,发行版本和开发版本以及此代码通过Eclipse运行的时间(我重定向输出to stdout)我可以在控制台上看到该程序只是挂起并且没有继续进行,因为maven希望用户手动点击'ENTER'来询问问题,然后我通过Eclipse手动终止Java程序,之后子流程创建仍然运行并适当地生成我的标记,我尝试使用System.exit(0)终止Java程序,但这会终止所有子进程以及停止maven生命周期执行。
到目前为止我尝试过的事情 -
1)直接传递参数为标签名称,发布版本和下一个开发版本 - “release:prepare -Dtag = my-proj-1.10 -DreleaseVersion = 4.1.12 -DdevelopmentVersion = 4.1.13- SNAPSHOT“但该程序抱怨无效的maven生命周期。
2)尝试使用来自mvn共享插件的API的mvn-invoker来按照这篇文章运行maven目标 - https://tfesenko.com/2015/10/09/running-maven-tasks-from-java-code/并在pom中添加了这种依赖 -
<!-- https://mvnrepository.com/artifact/org.apache.maven.shared/maven-
shared-components -->
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-shared-components</artifactId>
<version>16</version>
</dependency>
但是没有下载所需的依赖项并将其放在java构建路径上。
使用mvn-invoker来执行maven目标还是旧的Java Process方法更好?如果mvn:invoker那么我可以从哪里下载依赖jar maven-shared-components 以将它放在构建路径上?
上面的Java ProcessBuilder代码我做错了什么?