2016-06-01 3 views
0

Я выполняю файл jar в java. пока мой код работает отлично.Выполнение файла jar в java

им выполнение EpubCheck с помощью Java, поскольку его консольное приложение

здесь адрес 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

Добавление кавычек в командной строке не работает.

документация Javadoc для exec(String, ...) говорит, что это:

Более точно, командная строка разбивается на лексемы с помощью StringTokenizer, созданного вызовом new StringTokenizer(command) без дополнительной модификации категорий символов. Токены, созданные токенизатором, затем помещаются в новый массив строк cmdarray в том же порядке.

Если затем посмотреть на Javadoc для StringTokenizer, он говорит:

Методы StringTokenizer не различают среди идентификаторов, чисел и строк в кавычках, и они не распознают и пропускать комментарии.

и

токенизатор [производства new StringTokeniser(string)] использует набор разделитель по умолчанию, который является "\ т \ п \ г \ е".

Иными словами, exec разделит командную строку на аргументы, игнорируя любое цитирование.

Любые кавычки (или экраны с двойным обратным слэшем) будут просто рассматриваться как символы notmal.Например:

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

будет пытаться искать файл JAR называется "C:/Users/My. Да ... в начале пути есть ведущая цитата.

Вы можете избежать этой проблемы, выполнив аргумент самостоятельно; например

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\""}); 
Смежные вопросы