无法使用java

时间:2017-06-11 04:47:55

标签: java shell maven

我无法使用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权限。有人能让我知道我可能做错了吗?

1 个答案:

答案 0 :(得分:1)

以下是一些观察结果:

  1. getInputStream()返回的流是子进程的标准输出流。错误消息通常写入标准错误。请尝试改为阅读getErrorStream()

  2. 我不确定在调用Process之后是否可以读取waitFor()对象的标准输出/错误。它根本不会给你任何东西,也不会截断流。在最坏的情况下,它可能会陷入僵局。 (外部进程因为其输出/错误管道被阻塞而卡住......因为没有任何东西正在读取它。因此它可以退出。因此Java waitFor()调用无法返回。但Java端只读取管道 waitFor()之后的返回。)

  3. 修正:

    1. 在单独的线程中执行IOUtils.copy,并在致电p.waitFor之前启动该线程。
    2. 读取两个流...或使用重定向将它们合并为一个流。
    3. 或者,将输出重定向到文件并在Java外部查看。
    4. ProcessBuilder中有很多关于如何实现重定向的材料。或者,在shell脚本中执行此操作。