我正在尝试从我的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运行可执行文件的正确方法是什么?
答案 0 :(得分:0)
getResource("res")
返回URI
这不是文件引用,getPath
返回该URI
的URLencoded字符串,这是手动替换所有特殊符号的错误方法。因此,让java自己找到URI
的正确路径
URL brokerURI = MqttServerInterface.class.getResource("broker/mosquitto.exe");
Path pathToBroker = Paths.get(brokerURI.toURI());
String brokerCommand = pathToBroker.toString();
答案 1 :(得分:-1)
正如您在评论中发布的那样,System.out.println(broker);
的结果显示以下内容:
/N:/dropbox/Dropbox/projects/robot%202.0/prophio%203/prophio3/build/classes/com/trobot/prophio3/broker/mosquitto.exe
这看起来像一个URL编码的URI,它不是文件路径,由其中%20
的出现表示。解决这个问题的一种方法是用实际空格替换它们,例如:
broker = broker.replace("%20", " ");