从适用于Android应用程序的Java桌面应用程序运行Gradle构建脚本

时间:2015-09-22 16:53:05

标签: java android javafx build.gradle

我正在尝试通过按下构建按钮,通过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的输出: - 没有。没有输出。不知道它是否正在运行。

1 个答案:

答案 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();
        }
    });
}