2016-06-01 4 views
0

Ich bin eine JAR-Datei in Java ausgeführt wird. Soweit funktioniert mein Code einwandfrei.Ausführen von JAR-Datei in java

im über Java-Ausführung epubcheck, weil seine eine Konsolenanwendung

hier ist die Adresse des epubcheck

https://github.com/IDPF/epubcheck

außer, wenn der Name der Datei, die ich sehen müssen enthält 'Zeichen und Leerzeichen im Ordnernamen oder Leerzeichen im Dateinamen.

hier ist der Fehler auf Ordnernamen hier

Unrecognized argument: 'Files\1.epub' 

der Fehler wird, wenn der Dateiname 'enthält

Unrecognized argument: 'the' 

dies mein Code

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

hier ist, wie man Führen Sie den epubchecker

java -jar epubcheck.jar file.epub 

, aber wenn ich es auf Eingabeaufforderung manuell hat es mir nicht geben einen Fehler

Antwort

4

Sie sollten die Token zitieren, die Befehlszeile bilden. Verwenden Sie die .exec(String[]) Version

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

danke. Dein Code funktioniert perfekt – knowme

1

Anführungszeichen in die Befehlsfolge Hinzufügen funktioniert nicht.

Die javadoc für exec(String, ...) sagt dies:

Genauer gesagt wird die Befehlsfolge in Token gebrochen durch den Aufruf einer StringTokenizer erstellt mit new StringTokenizer(command) ohne weitere Modifikation der Zeichenkategorien. Die vom Tokenizer erzeugten Tokens werden dann in derselben Reihenfolge in das neue String-Array cmdarray gestellt.

Wenn Sie dann für StringTokenizer am javadoc aussehen, heißt es:

Die StringTokenizer Methoden unterscheiden nicht zwischen Bezeichner, Zahlen und Strings in Anführungszeichen, noch haben sie erkennen und Kommentare überspringen.

und

Die tokenizer [hergestellt von new StringTokeniser(string)] verwenden den Standard delimiter Satz, der "\ t \ n \ r \ f" ist.

Mit anderen Worten, exec wird die Befehlszeichenfolge in Argumente aufteilen und jede Anführung ignorieren.

Alle Zitate (oder Doppelbackslash) wird einfach als notmal Zeichen behandelt werden.Zum Beispiel:

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

werden versuchen, für eine JAR-Datei "C:/Users/My genannt zu suchen. Ja ... Es gibt ein führendes Zitat am Anfang des Pfadnamens.

Sie können dieses Problem vermeiden, indem Sie das Argument selbst ausführen; z.B.

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

Beachten Sie, es gibt keine zusätzlichen Angebote.


Es ist auch möglich, eine Shell zu verwenden, um mit zu zitieren, wenn (aus irgendeinem Grund) Ihre Anwendung mit einem bereits zitierten Pfad vorgesehen ist. Zum Beispiel (Linux/Unix/Mac OSX)

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