我正在尝试通过按下构建按钮,通过Java桌面应用程序自动构建Android应用程序 - 因为我需要更改一些清单值和字符串值。所有这一切,但我需要执行“gradle assembleRelease -pMyProjectPath”,但我一直遇到问题。以下是我尝试过的组合:
测试1
ProcessBuilder builder = new ProcessBuilder("call", "gradle", "assemble ", "-p" , projectPath);
测试1的输出:
java.io.IOException:无法运行程序“调用”:CreateProcess error = 2,系统找不到指定的文件
我尝试了“调用”,因为根据我的理解,gradle不是可执行文件(它是在黑暗中拍摄)
测试2
ProcessBuilder builder = new ProcessBuilder( "C:\\developer\\tools\\gradle-2.3\\bin\\gradle", "assemble ", "-p"+projectPath);
测试2的输出
java.io.IOException:无法运行程序“C:\ developer \ tools \ gradle-2.3 \ bin \ gradle”:CreateProcess error = 193,%1不是有效的Win32应用程序
gradle在我的环境路径中。
测试3
ProcessBuilder builder = new ProcessBuilder("cmd", "gradle", "assemble ", "-p" + projectPath);
测试3的输出: - 没有。没有输出。不知道它是否正在运行。
答案 0 :(得分:2)
一个重大问题是我没有包含" / C"在ProcessBuilder参数中。
这是我用来从UI编译gradle的工作版本:
private void startGradleExecutorService() {
statusLabel.setText("Building...");
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/C", projectPath + "/gradlew assembleRelease -p" + projectPath, "--info");
builder.redirectErrorStream(true);
try {
Process p = builder.start();
BufferedReader stdout = new BufferedReader(
new InputStreamReader(p.getInputStream()));
System.out.println("outputString:: " + stdout.readLine());
while ((outputString = stdout.readLine()) != null) {
System.out.println("outputString:: " + outputString);
Platform.runLater(() -> {
//if you change the UI, do it here !
statusLabel.setText(outputString);
});
if (outputString.contains("BUILD")) {
break;
}
}
p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();
p.destroy();
} catch (IOException e) {
e.printStackTrace();
}
});
}