2013-11-09 93 views
1

我試圖運行使用的Runtime.exec從java類功能的另一個罐子一個可執行的JAR使用Java運行時jar文件。
代碼是無法從另一個罐子訪問在Linux平臺上

Runtime r = Runtime.getRuntime(); 
Process p = r.exec("java -jar \""+_JarPath +"\" " + "\""+ args[0]+"\""+ " " +"\""+ args[1]+"\""+ " " +"\""+ args[2]+"\"" + " " +"\""+ args[3]+"\""); 

這裏,參數args不爲空,並明確界定。

此代碼運行在Windows平臺上很好,但在Linux上,我收到錯誤

無法訪問jar文件 「/opt/mydir/lib/MyFol/mytest.jar」

我看過其他類似的問題,並提出確保

  1. 目錄/opt/mydir/lib/MyFol/和文件mytest.jar都擁有所有權限
  2. 啓動此進程命令的可執行jar也具有所有權限。
  3. 用戶在Linux上爲admin

我在Linux上使用OpenJDK的

+0

也許另一重載函數傳遞參數你正在使用的'jar'已被損壞? – tokhi

+0

@stsd一點都不...... ...... – dbw

+2

請發佈完整的錯誤訊息。看起來很奇怪,你在開始時有雙引號字符,但不是在結尾。 –

回答

2

嘗試不帶雙引號。我懷疑這可能是shell沒有被調用的問題,而是直接調用Java。

+0

,但如果我刪除雙引號,那麼我將如何逃脫之間的空白空間.....讓我試試這也..... – dbw

+1

@dbw這就是爲什麼在那裏是exec()的另一個重載。而且,請允許我這樣說:命名帶有空白的文件只是愚蠢的。 – Ingo

+0

@Ingo但是文件名不包含空格,它是完整路徑和其他提供的參數,它們包含空格,但是由於提供了一個我無法找到的簡單解決方案,然後我去了尋找另一個解決方案的大圓圈...... 謝謝..... – dbw

5

與Linux機器上面的代碼中的實際問題是雙引號,如post羅賓綠說,他是對的。
但是當路徑包含空的空格或其他論點之間是具有空間我無法運行罐子。
對於我不得不嘗試一些其他的方式來加載罐,其可以工作在兩種平臺上無縫和有過刪除空間的問題。
進程生成來營救,在這種情況下。

ProcessBuilder pb = new ProcessBuilder("java", "-jar", _JarPath, args[0], args[1], args[2], args[3]); 
Process p = pb.start(); 

在所有情況下,這兩個平臺上都沒有任何探針都能正常工作。

編輯
OOPS一個簡單的解決辦法是有,但我沒有得到它,感謝英戈comment posted,我們可以通過使用exec

Runtime r = Runtime.getRuntime(); 
Process p =null; 
String[] cmdarray = new String[7]; 
cmdarray[0] = "java"; 
cmdarray[1] = "-jar"; 
cmdarray[2] = _JarPath;     
cmdarray[3] = args[0]; 
cmdarray[4] = args[1]; 
cmdarray[5] = args[2]; 
cmdarray[6] = args[3]; 
p = r.exec(cmdarray);