具有动态路径的 ProcessBuilder(可能带有空格)

ProcessBuilder with dynamic path (possibly with spaces)

我正在尝试从我的 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 的可执行文件的正确方法是什么?

当您发表评论时,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", " ");

getResource("res") returns URI 不是文件引用,getPath returns URI 的 URL 编码字符串和它手动替换所有特殊符号是错误的方法。所以让 java 自己找到 URI 的正确路径

URL brokerURI = MqttServerInterface.class.getResource("broker/mosquitto.exe");
Path pathToBroker = Paths.get(brokerURI.toURI());    
String brokerCommand = pathToBroker.toString();