首页 > 解决方案 > 为什么 ProcessBuilder 找不到在早期进程中创建的文件?

问题描述

我的代码首先通过调用msbuild编译一个 C# 程序,然后运行新创建的 exe。代码成功编译程序,可以看到新创建的文件,但是下一个进程找不到。它不断抛出一个java.io.IOException: Cannot run program "path-to-my-app\bin\Debug\App.exe": CreateProcess error=2, The system cannot find the file specified

如果我一次运行一个,每个都可以成功,但不能一起运行。

下面是运行 msbuild 的方法:

    public App compileApp() throws IOException {
        String[] param = new String[5];
        param[0] = "msbuild";
        param[1] = "-clp:ErrorsOnly;verbosity:minimal";
        param[2] = "-fl";
        param[3] = System.getenv("WORKSPACE") + "\\App.sln";
        param[4] = "-p:Configuration=Debug";
        ProcessBuilder pb = new ProcessBuilder(param);
        pb.redirectError(new File("App error.txt"));
        pb.start();

在这里我运行应用程序:

public App runApp (String executionChoice) throws IOException{
        Process p;
        String line;
        String[] param = new String[2];
        param[0] = System.getenv("EXE_PATH");
        param[1] = executionChoice;
        ProcessBuilder pb = new ProcessBuilder(param);
        pb.redirectError(new File("App error.txt"));
        try {
            p = pb.start();
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            while((line = input.readLine()) != null){
                logger.info(line);
            }
            input.close();
            p.destroy();
        } catch (IOException e) {
            System.err.println(e.getMessage());
            throw e;
        }finally {
            assertAll(null, test);
        }
        return this;
    }

我的猜测是,在调用第二种方法时,子进程还没有完成,这就是它找不到文件的原因。这是我已经尝试过但没有奏效的方法:

  1. 调用 p.waitFor() - 出于某种原因,这样做会阻止完全创建 exe,创建了 bin 和 Debug 文件夹,但没有创建 exe。
  2. 硬睡眠等待 - 完全无效。
  3. 将编译部分作为批处理文件运行,例如 Runtime.getRuntime().exec("path-to-my-.bat") - 这呈现了相同的结果

标签: javamsbuildprocessbuilder

解决方案


推荐阅读