我试图从我的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运行可执行文件的正确方法?
这很奇怪,首先在你的类路径中有一个“外部”可执行文件。你确定你不是想要从PATH环境变量中取出它吗? – fge
@fge嗯,我对Java很陌生,所以我不知道最佳实践,但我希望可以在一个包中包含可执行文件,以便与我的Java应用程序一起提供。我也没有看到为什么我应该添加到'PATH'中,这可能会被我的应用程序使用。虽然,如果有更好的地方存储可执行文件比classpath,请建议。 – mactro
你可以显示什么'System.out.println(broker);'实际显示? – Lolo