2016-06-01 36 views
0

私はjavaでjarファイルを実行しています。これまでのところ私のコードは完璧に動作します。ここではそのコンソールアプリケーションJavaでjarファイルを実行

がepubcheck私が参照する必要があるファイルの名前は '記号が含まれている場合を除き、

https://github.com/IDPF/epubcheck

のアドレスであるためのJava経由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に同じ順序で配置されます。

あなたはその後、StringTokenizerのJavadocを見れば、それは言う:

StringTokenizerは方法は、識別子、数字、引用文字列を区別していない、また、彼らは認識して、コメントをスキップします。 [new StringTokeniser(string)によって生成]

トークナイザは "\ Tの\ Nの\ Rの\のF" で、デフォルトの区切り文字セットを使用します。

つまり、execは、コマンド文字列を引数に分割し、引用符を無視します。

引用符(または二重バックスラッシュエスケープ)は、単にnotmal文字として扱われます。たとえば、

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"}); 

注意点はありません。


(何らかの理由で)アプリケーションが既に引用されたパス名で提供されている場合引用に対処するためにシェルを使用することも可能です。たとえば(Linux/Unix/Mac OSX)

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