使用动态路径(可能包含空格)的ProcessBuilder

3

我想从我的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无法在路径中带有空格的情况下运行bat文件

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
你能展示一下 System.out.println(broker); 实际上会显示什么吗? - Lolo
@Lolo 它显示:/N:/dropbox/Dropbox/projects/robot%202.0/prophio%203/prophio3/build/classes/com/trobot/prophio3/broker/mosquitto.exe - mactro
那么,我可以理解这是一个本地应用程序吗? - fge
@fge 我尝试运行的应用程序是多平台应用程序(http://mosquitto.org/download/),但目前我只想运行它的Windows版本。 - mactro
显示剩余3条评论
2个回答

0

getResource("res") 返回的是一个不是文件引用的 URI,而 getPath 返回的是该 URI 的 URL 编码字符串,手动替换所有特殊符号是错误的。所以让 Java 自己找到正确的路径来处理该 URI

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

-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", " ");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接