【发布时间】:2023-02-10 19:32:59
【问题描述】:
我试图在 Linux 上从一个单独的 Java 应用程序调用 Gradle 应用程序。我正在使用 ProcessBuilder,它在不传递参数时调用 Gradle 应用程序没有问题,并且 Gradle 应用程序构建。但是当我包含一个参数时,它似乎根本没有运行 Gradle,但没有给出错误,并且仍然将 Processbuilder run 打印到终端。
这是在主要方法中:
String cmd = "./gradlew";
try {
String lines = null;
//This works but doesn't send an argument:
//ProcessBuilder pb = new ProcessBuilder(cmd, "run");
//won't run with an argument!
ProcessBuilder pb = new ProcessBuilder(cmd, "run", "argy");
Process pr = pb.start();
System.out.println("Processbuilder run");
BufferedReader reader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
while ((lines = reader.readLine())!=null) {
System.out.println("Line: " + lines);
}
}
catch (IOException e)
{
System.out.print("error");
e.printStackTrace();
}
}
在没有 argy 的情况下运行 ProcessBuilder 时的终端输出:
Processbuilder run
Line: > Task :app:compileJava
Line: > Task :app:processResources
Line: > Task :app:classes
Line:
Line: > Task :app:run
Line:
Line: BUILD SUCCESSFUL in 1s
Line: 3 actionable tasks: 3 executed
`
使用 argy 运行 ProcessBuilder 时的终端输出:
Processbuilder run
我需要传递 java 对象,所以我不能使用 Runtime.getRuntime().exec(),因为它只传递一个字符串作为参数。
如何让 ProcessBuilder 向 Gradle 提供参数并让它运行?或者是否有其他方法可以从完全独立的 java 包中调用 Gradle 应用程序?
【问题讨论】:
-
您没有阅读
Process的错误流,这可能是您没有看到任何错误但也没有看到任何预期输出的原因。您可以执行pb.redirectErrorStream()将进程的错误流重定向到它的输出流。如果你这样做,你会看到什么? -
您可能还想查看Gradle Tooling API。
-
顺便说一句,即使使用
ProcessBuilder,您也只能传递String参数 -
重定向错误流后,我意识到它没有传递
--arg="argy",只是传递"argy"。所以我在processBuilder部分添加了String myArgVar = "argy";、String myArg = String.format("--args=\" %s", myArgVar);和 myArg 而不是“argy”,它起作用了。唉,正如 user16320675 指出的那样,它只需要字符串参数,所以我现在正在研究 Gradle Tooling API,谢谢 Slaw!我想这正是我想要的。
标签: java gradle processbuilder gradlew