Пробелы в пути к файлу в java

У меня есть папка, содержащая несколько файлов jar. Я имею в виду эти файлы jar из другого файла jar, который находится в другом месте.

Моя проблема в том, что когда я указываю путь к папке jar, например, C:\Trial Library\jar Folder\, т.е. с пробелом в именах папок (пробная библиотека), то он не может найти эту папку.

Если даю без пробела т.е. C:\Trial_Library\jar_Folder\ то работает нормально.

Пожалуйста, помогите мне решить эту проблему как можно скорее.

Вот мой пакетный файл

set CURRENT_DIRECTORY=%~dp0

set ANT_HOME=%"CURRENT_DIRECTORY"%ant\apache-ant-1.8.3
ECHO current directory is %CURRENT_DIRECTORY%
ECHO %ANT_HOME%
set Path=%ANT_HOME%\bin
set ADAPTER_LIBRAY_PATH=%1
set USER_JAR_PATH=%2
set CLASS_NAME=%3
set RESULTS_PATH=%4
set JUNIT_PATH=%"CURRENT_DIRECTORY"%ANT\test\junit-4.1.jar
set LIBRAIES_TO_INCLUDE="%JUNIT_PATH%";"%ADAPTER_LIBRAY_PATH%";"%USER_JAR_PATH%"
ECHO %LIBRAIES_TO_INCLUDE%
ECHO %ADAPTER_LIBRAY_PATH%
ECHO %JUNIT_PATH%
ECHO %USER_JAR_PATH%
ECHO %CLASS_NAME%
ECHO %RESULTS_PATH% 

ant -lib "%LIBRAIES_TO_INCLUDE%" -Dlibraries="%ADAPTER_LIBRAY_PATH%" -Djunitlibrary="%JUNIT_PATH%" -Djartobeexec="%USER_JAR_PATH%" -Duserclass=%CLASS_NAME% -Dresultspath=%RESULTS_PATH% -buildfile build.xml test-html

Здесь я передаю значения в свой пакетный файл

String[] commands=new String[5];
commands[0]="driver.bat";
commands[1]=finalLibraryPath;
commands[2]=executingJarLocation;
commands[3]=tempPackageName;
commands[4]=resultsFolderPath;
process = Runtime.getRuntime().exec(commands); 
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
StringBuffer errorStr = new StringBuffer(); 
String line;
while ((line = br.readLine()) != null) {
errorStr.append(line);
errorStr.append(System.getProperty("line.separator"));  

}

Спасибо заранее

С уважением, Прабху


person Prabhu RK    schedule 30.08.2012    source источник


Ответы (3)


Хорошо, насколько я понимаю, я "догадываюсь", что вы делаете что-то вроде

Runtime.exec("myBatchFile.bat " + path);

Это закончится слезами. Это равносильно высказыванию:

C:> myBatchFile.bat C:\Path to my jar files

Это не сработает. По сути, ваш пакетный файл теперь считает, что он имеет 5 параметров вместо одного.

Чтобы решить проблему, вам нужно передать каждую команду/параметр отдельно...

Runtime.exec(new String[] {"mybatchFile.bat", path});

Или еще лучше, используйте ProcessBuilder

ProcessBuilder pb = new ProcessBuilder("myBatchFile.bar", path);
person MadProgrammer    schedule 30.08.2012
comment
Программист: Наконец-то я обнаружил проблему. Нет проблем с передачей параметров в пакетный файл. Я добавил %~s1 в путь к моей библиотеке в пакетном файле, который удаляет пробел и добавляет ~1, что понятно муравью. Теперь он работает отлично. Спасибо, чувак, что помог мне. - person Prabhu RK; 31.08.2012
comment
Вау, это было много бега :P - Рад, что мы нашли решение в конце - person MadProgrammer; 31.08.2012

Заключите путь в кавычки. Это означает, что компьютер воспринимает это буквально. У вас может быть аналогичная проблема с блокнотом, где он добавляет расширение .txt в конце, даже если вы указываете расширение. Заключение в кавычки решает эту проблему.

person imulsion    schedule 30.08.2012
comment
я получаю путь и сохраняю его в строке, а затем только передаю его сервисному уровню для обработки, т.е.) String samplePath=C:\Trial Library\jar Folder. Это то, что вы пытаетесь сказать? - person Prabhu RK; 30.08.2012
comment
Нет, кавычки там просто говорят, что это строка. попробуйте это: String samplepath = \C:\Trial Library\jar Folder\ - person imulsion; 30.08.2012
comment
значение строки не жестко закодировано. т.е.) у меня есть String samplePath=request.getParameter(jarPath); Пожалуйста, помогите мне в решении этого. - person Prabhu RK; 30.08.2012

Как правило, заключение пути в двойные кавычки («путь») работает на таких платформах, как Unix, Linux и т. д. Проблема возникает только на платформе WIN. Причина этого в том, что как только WIN видит пробел в пути к файлу, который нужно выполнить, он возвращается к именованию 8.3. В этом именовании он принимает первые 6 символов подкаталога в качестве параметра и ищет шаблон. Чтобы решить эту проблему, вы должны добавить к первым 6 символам тильду (~) и число, представляющее экземпляр этого шаблона.

Например:

** Исходный ПУТЬ: C:/Program Files/Jdk1.6.0_07/bin

ПУТЬ для использования: C:/Progra~1/Jdk1.6.0_07/bin**

Я использовал аналогичный подход во многих своих Java-приложениях, и он всегда работал правильно.

person Deepesh Kankaria    schedule 21.11.2014
comment
Это 1) неверно; Windows обрабатывает пути с пробелами точно так же, как и другие: если вы заключаете его в пробелы в качестве аргумента, он воспринимается как один аргумент. Кто-то даже разместил это здесь уже... более двух лет назад. 2) Это не было проблемой в этом вопросе. - person Andrew Barber; 21.11.2014
comment
попробуй, чувак... Вы можете обратиться к следующей ссылке ссылка для получения дополнительных объяснений, и если окна обрабатывали бы пути таким же образом, тогда подобные вопросы не появлялись бы на форуме. - person Deepesh Kankaria; 21.11.2014
comment
Не уверен, что вы хорошо прочитали эту ссылку. Он говорит именно то, что я сказал: заключите их в двойные кавычки. Упомянутое единственное различие заключается в том, что Unix-системы также принимают одинарные кавычки. Виндовс нет. И да; вы также можете использовать путь 8.3. Но ваше утверждение, что Windows не поддерживает цитирование, неверно. И еще; дело не в этом. - person Andrew Barber; 21.11.2014