2015-07-13 167 views
2

我试图从我的Java应用程序运行外部可执行文件。它驻留在该应用程序的一个包中,但该应用程序的路径可能会有所不同,并可能包含空格。我曾尝试过:带有动态路径的ProcessBuilder(可能带空格)

String broker = MqttServerInterface.class.getResource("broker/mosquitto.exe").getPath(); 

System.out.println(broker);    
ProcessBuilder pb = new ProcessBuilder(broker,"-p",port);    

server = pb.start(); 

它可以在没有空格的路径上正常工作。但是,如果有空格,它会给CreateProcess错误= 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

这很奇怪,首先在你的类路径中有一个“外部”可执行文件。你确定你不是想要从PATH环境变量中取出它吗? – fge

+0

@fge嗯,我对Java很陌生,所以我不知道最佳实践,但我希望可以在一个包中包含可执行文件,以便与我的Java应用程序一起提供。我也没有看到为什么我应该添加到'PATH'中,这可能会被我的应用程序使用。虽然,如果有更好的地方存储可执行文件比classpath,请建议。 – mactro

+0

你可以显示什么'System.out.println(broker);'实际显示? – Lolo

回答

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