【发布时间】:2015-07-13 11:28:06
【问题描述】:
我正在尝试从我的 Java 应用程序运行外部可执行文件。它驻留在该应用程序的包中,但该应用程序的路径可能会有所不同,并且可能包含空格。我试过了:
String broker = MqttServerInterface.class.getResource("broker/mosquitto.exe").getPath();
System.out.println(broker);
ProcessBuilder pb = new ProcessBuilder(broker,"-p",port);
server = pb.start();
在没有空格的路径上运行良好。但是,当有空格时,它给出CreateProcess error=267,目录名无效。
根据这里的建议,我已经重写了代码:ProcessBuilder cannot run bat file with spaces in path:
String brokerDir = MqttServerInterface.class.getResource("broker").getPath();
System.out.println(brokerDir);
ProcessBuilder pb = new ProcessBuilder("mosquitto.exe","-p",port);
pb.directory(new File(brokerDir));
pb.redirectError();
server = pb.start();
但是现在,我仍然收到错误 267,路径中有空格,而没有错误 2(系统找不到指定的文件)。从 Java 运行可执行文件的正确方法是什么?
【问题讨论】:
-
在你的类路径中有一个“外部”可执行文件是很奇怪的。您确定不是要从
PATH环境变量中获取它吗? -
@fge 好吧,我对 Java 还很陌生,所以我不知道最佳实践,但我希望将这个可执行文件与我的 Java 应用程序一起提供,可能在一个包中。我也看不出我为什么要添加到
PATH一些可能仅由我的应用程序使用的东西。虽然,如果有比类路径更好的存储可执行文件的地方,请提出建议。 -
您能展示一下
System.out.println(broker);实际显示的内容吗? -
@Lolo 它显示:
/N:/dropbox/Dropbox/projects/robot%202.0/prophio%203/prophio3/build/classes/com/trobot/prophio3/broker/mosquitto.exe -
那么,我认为这是一个原生应用吗?
标签: java file-io processbuilder