java - 为什么 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;
}
我的猜测是,在调用第二种方法时,子进程还没有完成,这就是它找不到文件的原因。这是我已经尝试过但没有奏效的方法:
- 调用 p.waitFor() - 出于某种原因,这样做会阻止完全创建 exe,创建了 bin 和 Debug 文件夹,但没有创建 exe。
- 硬睡眠等待 - 完全无效。
- 将编译部分作为批处理文件运行,例如 Runtime.getRuntime().exec("path-to-my-.bat") - 这呈现了相同的结果
解决方案
推荐阅读
- r - R:从网站导入脚本
- ios - 如何自定义有关“failureRequiringAppLaunch”类型的 Siri 意图响应的错误消息
- java - 有没有办法替换以前由 pyx4me.com 托管的 Maven 依赖项?
- javascript - 试图检查页面上是否有任何复选框被选中
- javascript - 在 JavaScript 中,如何过滤具有动态条件的数组?
- python - Python - 数字的图像检测
- c# - 为 Dictionary 编写 lambda 表达式
成员 - javascript - firebase.firestore.FieldValue.delete() 不删除文档中的字段
- c# - 我正在寻找 IHttpClientFactory -> HttpMethod.Post 示例
- typo3-8.x - 无法使用chrome登录typo3后端