2015-10-07 58 views
1

爲什麼我在這兩種情況下遇到不同的行爲?我錯過了什麼嗎?ProcessBuilder - 沒有這樣的文件或目錄(但Runtime.exec()工作)

命令:

new ProcessBuilder().directory(
        Paths.get(System.getProperty("user.dir")).toFile()) 
        .command("/usr/bin/java -Djava.library.path=/Users/myusername/myproject/lib/DynamoDBLocal_lib/ -jar /Users/myusername/myproject/lib/DynamoDBLocal.jar -sharedDb").start(); 

堆棧跟蹤:

Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Cannot run program "/usr/bin/java -Djava.library.path=/Users/myusername/myproject/lib/DynamoDBLocal_lib/ -jar /Users/myusername/myproject/lib/DynamoDBLocal.jar -sharedDb" (in directory "/Users/myusername/myproject"): error=2, No such file or directory 
    at com.comcast.tvx.app.xreserver.Main.exec(Main.java:47) 
    at com.comcast.tvx.app.xreserver.Main.main(Main.java:16) 
Caused by: java.io.IOException: Cannot run program "/usr/bin/java -Djava.library.path=/Users/myusername/myproject/lib/DynamoDBLocal_lib/ -jar /Users/myusername/myproject/lib/DynamoDBLocal.jar -sharedDb" (in directory "/Users/myusername/myproject"): error=2, No such file or directory 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) 
    at com.comcast.tvx.app.xreserver.Main.exec(Main.java:44) 
    ... 1 more 
Caused by: java.io.IOException: error=2, No such file or directory 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:248) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:134) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) 
    ... 2 more 

環境中失敗的情況下:

{PATH=/usr/bin:/bin:/usr/sbin:/sbin 
JAVA_STARTED_ON_FIRST_THREAD_1074=1 
SHELL=/bin/zsh 
SECURITYSESSIONID=186a4 
USER=myusername 
JAVA_MAIN_CLASS_25188=com.comcast.tvx.app.xreserver.Main 
APP_ICON_1074=../Resources/Eclipse.icns 
COMMAND_MODE=unix2003 
TMPDIR=/var/folders/t_/dlj2wfdj0bx2xl6mnnqmxyhj99pf4b/T/ 
SSH_AUTH_SOCK=/tmp/launch-Bhd1It/Listeners 
DISPLAY=/tmp/launch-PuSx66/org.macosforge.xquartz:0 
__CF_USER_TEXT_ENCODING=0x529B388B:0:0 
Apple_PubSub_Socket_Render=/tmp/launch-hB7zpQ/Render 
__CHECKFIX1436934=1 
LOGNAME=myusername 
HOME=/Users/myusername} 

更多信息

當我的Runtime.exec()的環境看上去是一樣的,但我不明白的錯誤做:

命令:

Runtime.getRuntime().exec("/usr/bin/java -Djava.library.path=/Users/myusername/myproject/lib/DynamoDBLocal_lib/ -jar /Users/myusername/myproject/lib/DynamoDBLocal.jar -sharedDb") 

環境的成功案例:

{PATH=/usr/bin:/bin:/usr/sbin:/sbin 
JAVA_STARTED_ON_FIRST_THREAD_1074=1 
SHELL=/bin/zsh 
JAVA_MAIN_CLASS_25360=com.comcast.tvx.app.xreserver.Main 
SECURITYSESSIONID=186a4 
USER=myusername 
APP_ICON_1074=../Resources/Eclipse.icns 
COMMAND_MODE=unix2003 
TMPDIR=/var/folders/t_/dlj2wfdj0bx2xl6mnnqmxyhj99pf4b/T/ 
SSH_AUTH_SOCK=/tmp/launch-Bhd1It/Listeners 
DISPLAY=/tmp/launch-PuSx66/org.macosforge.xquartz:0 
__CF_USER_TEXT_ENCODING=0x529B388B:0:0 
Apple_PubSub_Socket_Render=/tmp/launch-hB7zpQ/Render 
__CHECKFIX1436934=1 
LOGNAME=myusername 
HOME=/Users/myusername} 

回答

4

嘗試要更改此行:

.command("/usr/bin/java -Djava.library.path=/Users/myusername/myproject/lib/DynamoDBLocal_lib/ -jar /Users/myusername/myproject/lib/DynamoDBLocal.jar -sharedDb").start(); 

(滾動到右側以查看不同ENCE):

.command("/usr/bin/java -Djava.library.path=/Users/myusername/myproject/lib/DynamoDBLocal_lib/ -jar /Users/myusername/myproject/lib/DynamoDBLocal.jar -sharedDb".split("\\s+")).start(); 

說明:輸入到command()應該是一個字符串數組(或列表),其每個是另一個參數(或「標記」)。它不應該包含空格!

docs

a command, a list of strings which signifies the external program file to be invoked and its arguments, if any. Which string lists represent a valid operating system command is system-dependent. For example, it is common for each conceptual argument to be an element in this list, but there are operating systems where programs are expected to tokenize command line strings themselves - on such a system a Java implementation might require commands to contain exactly two elements.

相關問題