2016-06-01 106 views
0

我在java中執行jar文件。到目前爲止我的代碼完美地工作在java中執行jar文件

IM通過Java執行epubcheck,因爲它的控制檯應用程序

這裏是epubcheck

https://github.com/IDPF/epubcheck

的不同之處時,我需要瀏覽文件名包含 '標誌的地址 和空間上的文件夾名稱或空間上的文件名稱。

這裏是文件夾名稱

Unrecognized argument: 'Files\1.epub' 

在這裏的錯誤是錯誤時,文件名中包含「

Unrecognized argument: 'the' 

這是我的代碼

String a = System.getProperty("user.dir") + "\\epubcheck-4.0.1\\" + "epubcheck.jar"; 
    Process p = Runtime.getRuntime().exec("java -jar" + " " + a + " " + selectedFile.getAbsolutePath()); 

這裏是如何運行epubchecker

java -jar epubcheck.jar file.epub 

,但是當我在命令提示符下運行手動它並沒有給我一個錯誤

回答

4

你應該引用的是讓你的命令行中的令牌。使用.exec(String[])版本

Runtime.getRuntime().exec(new String[]{"java" 
    , "-jar" 
    , a 
    , selectedFile.getAbsolutePath()}); 
+0

謝謝。你的代碼完美無缺 – knowme

1

將引號添加到命令字符串不起作用。

exec(String, ...)的Javadoc這樣說:

更確切地說,該命令串被分成使用由呼叫new StringTokenizer(command)與字符類別無需進一步修改創建StringTokenizer令牌。然後將令牌生成器生成的令牌以相同的順序放入新字符串數組cmdarray中。

如果你再看看Javadoc文檔StringTokenizer,它說:

StringTokenizer的方法不標識符,數字和引用字符串區分,它們也不識別和跳過註釋。

標記生成器[由new StringTokeniser(string)產生]使用默認分隔符集,這是 「\噸\ n \ r \ F」。

換句話說,exec會將命令字符串拆分爲參數,忽略任何引用。

任何引號(或雙反斜槓轉義符)將被簡單地視爲正式字符。例如:

exec("java -jar \"C:/Users/My User Name/foo.jar\""); 

將嘗試查找名爲"C:/Users/My的JAR文件。是的...在路徑名的開頭有一個引號。

你可以通過自己做論證來避免這個問題;例如

exec(new String[]{"java", 
         "-jar", 
         "C:/Users/My User Name/foo.jar"}); 

注意沒有加引號。


如果(出於某種原因)爲應用程序提供了已引用的路徑名,還可以使用shell來處理引用。例如(Linux/Unix/Mac OSX)

exec(new String[]{"bash", 
         "-c", 
         "java -jar \"/home/me/silly dir/foo.jar\""});