我无法使用java通过脚本执行maven命令。 maven命令假设创建一个未创建的原型文件夹。
这是java代码的样子:
ProcessBuilder pb = new ProcessBuilder("/log/script.sh");
pb.directory(new File("/log"));
Process p = pb.start();
p.waitFor();
IOUtils.copy(p.getInputStream(), System.out);
这是 script.sh 的样子
mvn archetype:generate -B -DarchetypeGroupId=my.archetype -DarchetypeArtifactId=archetype -DarchetypeVersion=1.0.0-SNAPSHOT -DgroupId=my.groupid -DartifactId=artifact -Dpackage=my.groupid.artifact -Dversion=1.0.0-SNAPSHOT -DarchetypeRepository=<link-to-repo>
ls
我可以在 ls 命令的输出中看到,maven命令创建的文件夹没有被创建,而当我尝试从终端运行脚本时,它被创造了。我已授予文件夹777权限。有人能让我知道我可能做错了吗?
答案 0 :(得分:1)
以下是一些观察结果:
getInputStream()
返回的流是子进程的标准输出流。错误消息通常写入标准错误。请尝试改为阅读getErrorStream()
。
我不确定在调用Process
之后是否可以读取waitFor()
对象的标准输出/错误。它根本不会给你任何东西,也不会截断流。在最坏的情况下,它可能会陷入僵局。 (外部进程因为其输出/错误管道被阻塞而卡住......因为没有任何东西正在读取它。因此它可以退出。因此Java waitFor()
调用无法返回。但Java端只读取管道 waitFor()
之后的返回。)
修正:
IOUtils.copy
,并在致电p.waitFor
之前启动该线程。ProcessBuilder中有很多关于如何实现重定向的材料。或者,在shell脚本中执行此操作。