it-swarm.com.ru

BAT-файл для создания Java CLASSPATH

Я хочу распространять приложение командной строки, написанное на Java на Windows. 

Мое приложение распространяется в виде Zip-файла, в котором есть запись каталога lib, в которой есть файлы .jar, необходимые для вызова моего основного класса. В настоящее время для сред Unix у меня есть сценарий Shell, который вызывает команду Java с CLASSPATH, созданным путем добавления всех файлов в каталог lib. 

Как мне написать .BAT файл с похожей функциональностью? Что является эквивалентом команды find Unix в мире Windows?

39
Binil Thomas

Вы хотите использовать цикл for в пакетном скрипте

 @echo off
 setLocal EnableDelayedExpansion
 set CLASSPATH="
 for /R ./lib %%a in (*.jar) do (
   set CLASSPATH=!CLASSPATH!;%%a
 )
 set CLASSPATH=!CLASSPATH!"
 echo !CLASSPATH!

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

Однострочный пакетный скрипт для удаления пустых каталогов

Чтобы быть честным, используйте ответ Джона, хотя, намного лучше, если все файлы находятся в одном каталоге, это может помочь вам в другое время.

65
Henry B

Почему вы используете найти? Предположительно, вы заранее знаете все библиотеки, в которых нуждается ваш jar-файл, так почему бы просто не перечислить их?

Кроме того, вы всегда можете использовать -Djava.ext.dirs=lib и позволить ему подобрать все таким образом.

29
Jon Skeet

Начиная с 6.0 Java поддерживает подстановочные пути к классам.

Синтаксис пути к классам командной строки Java

18
basszero

Вариант, если вы хотите, чтобы параметр CLASSPATH содержался вне сценария, и вы не запускали Shell с/V, вы можете сделать что-то вроде этого:

@echo off
FOR /R ./lib %%a in (*.jar) DO CALL :AddToPath %%a
ECHO %CLASSPATH%
GOTO :EOF

:AddToPath
SET CLASSPATH=%1;%CLASSPATH%
GOTO :EOF

Полезно для настройки вашей среды, когда вы просто играете в командной строке.

5
Eric Sorensen

Похоже, исполняемый JAR может работать для вас. Если вы распространяете Zip со всеми JAR-файлами, которые нужны вашей основной подпрограмме, и вы действительно выполняете его в командной оболочке, возможно, вы могли бы создать исполняемый JAR-файл с Main-Class и Classpath, определенными в манифесте. Все, что нужно сделать вашим пользователям - это дважды щелкнуть по банке, и Боб станет вашим дядей.

4
duffymo
SET CLASSPATH=""
FOR /R /lib %%a in (*.jar) DO CALL :AddToPath %%a
echo %CLASSPATH%

Java -cp %CLASSPATH% com.a.b.MyClass

pause

:AddToPath
SET CLASSPATH=%1;%CLASSPATH%
GOTO :EOF
2
Shirin Joshi

Когда я выпускаю JAR-файлы командной строки для Windows/Linux, я встраиваю все библиотеки JAR в мой JAR-файл с помощью команды ANT:

       <fileset dir="${module.classes.dir}"/>
       <zipfileset src="${endorsed.lib.dir}/myLibrary.jar"/>

Таким образом библиотеки объединяются с вашими файлами классов.

Это не лучший способ повторного использования двоичных файлов, но если библиотеки не так тяжелы, ваше приложение выполняется простым вызовом Java -jar myApp.jar в любой ОС.

0
Demiurgo

Возможность сделать вещи переносимыми - установить classpath относительно расположения самого пакетного файла.

В Windows (при условии Java 6+, классы в ./bin, jars в ./lib):

@Java -classpath %~dp0/bin;%~dp0/lib/* ClassName %1
0
Mike Godin

Вы можете использовать немного другой способ, если вы используете Maven для создания своего проекта . Application Assembler Maven Plugin предназначен для создания программ запуска приложений Java. Этот плагин генерирует для вас средство запуска bat-файлов и помещает зависимости в указанную папку. По желанию ваш лаунчер может зарегистрировать ваше приложение как сервис\демон.

Это тема об его использовании

Этот плагин поможет вам сохранить CM части вашего проекта DRY.

0
Andrii Khaisin

Есть ли более простой способ сделать это?

Да; 

Начиная с версии 6, вы можете использовать групповые символы пути к классам.

javac -cp .;../lib/* yourJavaCodeDir/YourJavaFile.Java

Смотрите также этот связанный Q & A.

0
shridutt kothari