BAT-файл для создания Java CLASSPATH - PullRequest
39 голосов
/ 07 февраля 2009

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

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

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

Ответы [ 10 ]

65 голосов
/ 07 февраля 2009

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

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

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

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

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

29 голосов
/ 07 февраля 2009

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

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

18 голосов
/ 07 февраля 2009

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

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

5 голосов
/ 20 февраля 2010

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

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

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

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

4 голосов
/ 07 февраля 2009

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

2 голосов
/ 29 июня 2011
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
0 голосов
/ 03 апреля 2017

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

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

@java -classpath %~dp0/bin;%~dp0/lib/* ClassName %1
0 голосов
/ 30 августа 2016

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

Да;

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

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

См. Также эту связанную Q & A.

0 голосов
/ 16 марта 2010

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

Это тема о том, как его использовать

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

0 голосов
/ 07 февраля 2009

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

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

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

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

...