【问题标题】:ProcessBuilder with dynamic path (possibly with spaces)具有动态路径的 ProcessBuilder(可能带有空格)
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    正如您在评论中发布的那样,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", " ");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 2012-10-29
      相关资源
      最近更新 更多