Java不被认为是eclipse的内部或外部命令,但在cmd中运行良好
我正在运行一个在eclipse(java)下从cmd开发的软件。它工作得很好。有一次我想用它来运行它 我正在将runnble java sw(B.jar)添加到另一个java程序(a)中。B.jar的“调用”在cmd中运行良好,并且正确地完成了任务。一旦从程序(A)调用,它就会给出“unrocongnized命令”的错误。我从eclipse执行程序(A)。我们必须在Eclipse中配置一些附加信息吗?或者我可能需要直接从软件发行版执行(A) 从cmd执行的屏幕截图: 来自eclipse的电子执行的屏幕截图: 2020-06-24 12:57:26172[Thread-7]信息—“爪哇岛”不是一个侦察司令部内部的地方 2020-06-24 12:57:26173[Thread-7]信息-外部环境,联合国计划,例如“可切割的外部环境”。 2020-06-24 12:57:36141[线程-6]信息-阿皮耶兹河畔的一个连续浇注机 从(A)到调用(B)的脚本:Java不被认为是eclipse的内部或外部命令,但在cmd中运行良好,java,eclipse,Java,Eclipse,我正在运行一个在eclipse(java)下从cmd开发的软件。它工作得很好。有一次我想用它来运行它 我正在将runnble java sw(B.jar)添加到另一个java程序(a)中。B.jar的“调用”在cmd中运行良好,并且正确地完成了任务。一旦从程序(A)调用,它就会给出“unrocongnized命令”的错误。我从eclipse执行程序(A)。我们必须在Eclipse中配置一些附加信息吗?或者我可能需要直接从软件发行版执行(A) 从cmd执行的屏幕截图: 来自eclipse的电子执
非常感谢您的帮助使用
Runtime.exec(String cmd,String[]envp,File dir)
重载{”“}
对于envp,您提供的子进程没有环境变量,特别是没有路径envvar,相当于一个空的。由于批处理文件显然运行的是一个简单的程序名java
,而不是完整的路径名,因此需要在PATH变量中查找该文件,并且由于PATH变量为空,因此查找失败。如果您不想或无法更改批处理文件以指定所有内容的完整路径(或者不依赖于任何envvars),并且如果需要,也可以类似地更改它运行的所有内容,那么最好的解决方案是对第二个(envp)传递passnull
exec
的参数,因此它使用默认值,即父Java自己的环境变量。更难的方法是手动构造一个正确的EnvVar列表(带值),并传递该列表
另外,您可以将
字符串[]
重载与新字符串[]{“script”,“command”}
一起使用,而不是将“script”+“+”参数“
串联起来,因为Runtime.exec
必须重新拆分。根据编译器的不同,您可能不需要新字符串[]
;我没有跟踪所有类型推断的更改,因为我通常更喜欢显式的。但是,既然您希望使用该组合进行跟踪,可能就不需要了。可能是@vmrvictor的一个副本,看起来很相似,但实际上并不是同一个问题;在我的例子中,两个程序之间的通信工作得很好(我猜),问题是在从eclipse运行后,我有一个java错误,您有哪个java错误,您可以共享stacktrace吗?请不要使用屏幕截图,而是复制粘贴文本。如何调用B?使用Runtime.exec()还是什么?发布执行的代码会很有帮助。
private final InputStream inputStream;
class Flux implements Runnable {
private final InputStream inputStream;
Flux(InputStream inputStream) {
this.inputStream = inputStream;
}
private BufferedReader getBufferedReader(InputStream instream) {
return new BufferedReader(new InputStreamReader(instream));
}
public void run() {
BufferedReader br = getBufferedReader(inputStream);
String line = "";
try {
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
String command = B_SW_AbsolutePath + " "+ usersCommand;
try {
Runtime rt = Runtime.getRuntime();
this.proc = rt.exec(command, {""}, outputDir);
Trace.info("execution "+command+" "+outputDir.toString());
Flux outputStream = new Flux(
this.proc.getInputStream());
Flux errorStream = new Flux(
this.proc.getErrorStream());
new Thread(outputStream).start();
new Thread(errorStream).start();
this.proc.waitFor(10,TimeUnit.SECONDS);
} catch (IOException e) {
Trace.erreur("External software can not be run " + e.getMessage());
}
finally{
this.process.destroy();
}
}