【问题标题】:Can't call Gradle with arguments from a java app using Process Builder, build fails无法使用 Process Builder 使用来自 Java 应用程序的参数调用 Gradle,构建失败
【发布时间】: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


【解决方案1】:

放置pb.redirectErrorStream(true)后;在pb.start() 之前,很明显我将“argy”作为命令而不是参数传递。 要运行 gradle,你需要命令 ./gradlew run --args="string_args" 所以我将它编辑为:


        String argy= "argybargy"";
        String myArg = String.format("--args=" %s", argy);


        try {
            String lines = null;

            ProcessBuilder pb = new ProcessBuilder("./gradlew", "run", myArg);

            pb.redirectErrorStream(true);
            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();
        }

现在运行,正确传递参数,并将任何错误重定向到终端。非常感谢所有的帮助。

【讨论】:

    猜你喜欢
    • 2015-06-17
    • 1970-01-01
    • 2017-07-18
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多