Есть ли способ включить все jar-файлы в каталоге в classpath?
Я пробую java -classpath lib/*.jar:. my.package.Program
и он не может найти файлы классов, которые, конечно же, находятся в этих банках. Нужно ли мне добавить каждый jar-файл в classpath отдельно?
Используя Java 6 или более поздней версии, параметр classpath, который поддерживает подстановочные знаки. Обратите внимание на следующее:
"
в)*
, а не *.банк
Окна
&ГТ; Ява -СР "и Test.jar;Либ/*" Мой.пакет.MainClass
В Unix
&ГТ; Ява -СР "и тест.банки:Либ/*" Мой.пакет.MainClass
Это похоже на Windows, но использует :
вместо ;
. Если вы не можете использовать подстановочные знаки, Баш
предлагает следующий синтаксис (где либерал
- это директория, содержащая все файлы архива с Java):
&ГТ; Ява -СР $(Эхо Либ/*.банки | тр ' ' ':')
(Обратите внимание, что использование classpath-это несовместимо с опцией -банк
. См. также: https://stackoverflow.com/questions/13018100/execute-jar-file-with-multiple-classpath-libraries-from-command-prompt)
Понимание Подстановочные Знаки
От классов документ:
&ГТ; записи пути к классу, может содержать подстановки имени файла символ *
, который является эквивалентным определению списка всех файлов
В каталоге с расширением
.jar
или.Банки
. Например, &ГТ; запись пути к классу сFoo/*
задает все JAR-файлы в каталог с именем &ГТ; ФОО. Запись пути к классу, состоящей только из*
расширяет список всех &ГТ; JAR-файлов в текущем каталоге. &ГТ; &ГТ; запись пути к классу, который содержит*
будет не соответствовать файлы класса. Для &ГТ; матч обоих классов и JAR-файлов в одной директории Foo, используйте либо &ГТ;фу;фу/*
илифу/*;фу
. Выбранный порядок определяет &ГТ; классы и ресурсы вфу
загружаются перед файлы Jar вфу
, или &ГТ; наоборот. &ГТ; > в поддиректории не рекурсивный поиск. Например, выглядит фу/&ГТ; для JAR файлов только в
фу, не в
фу/бар,
фу/баз и т. д. &ГТ; > в том порядке, в котором файлы Jar в каталоге перечисляются в &ГТ; расширение пути к классу не определяется и может отличаться от платформы к &ГТ; платформы и даже от момента к моменту на той же машине. А &ГТ; хорошо построен приложение не должно зависеть от какой-либо конкретной По порядку. Если требуется определенный порядок, то файлы jar могут быть &ГТ; четко прописанных в путь к классу. &ГТ; &ГТ; расширение подстановочных знаков делается рано, до вызова и GT; программы'с основным методом, а не поздно, во время загрузки класса &ГТ; сам процесс. Каждый элемент ввода пути к классу, содержащего &ГТ; подстановки заменяется (возможно, пустая) последовательность элементов &ГТ; генерируется путем перечисления JAR-файлы в указанном каталоге. Для &ГТ; например, если каталогфу
содержитa.jar
,b.jar и c.jar тогда &ГТ; путь класса есть
Foo/преобразуется в
foo/a.jar;foo/b.jar;foo/c.jar, > и эта строка будет значение системного свойства &ГТ;
Ява.класс.путь. &ГТ; и GT;
классовпеременная среды не любые относиться по-разному от и GT;
классакомандной строки (или
-СР) вариант. То есть, маски &ГТ; заслуженный во всех этих случаях. Однако, путь к классу подстановочные знаки не &ГТ; заслуженный В
класса-путь к банку-манифест` заголовка.
Примечание: из-за известной ошибки в Java 8, примеры Windows должны использовать обратную косую черту предыдущих записях с задней звездочкой: https://bugs.openjdk.java.net/browse/JDK-8131329
Под Windows это работает:
java -cp "Test.jar;lib/*" my.package.MainClass
и это не работает:
java -cp "Test.jar;lib/*.jar" my.package.MainClass
обратите внимание на *.фляги, *так шаблоны должны использоваться отдельно**.
На Linux, следующие работы:
java -cp "Test.jar:lib/*" my.package.MainClass
Сепараторы двоеточие вместо точки с запятой.
Мы можем обойти эту проблему путем развертывания основные myapp.jar Джар файл, который содержит манифест (Манифеста.файл MF) с указанием classpath в других необходимых банки, которые затем развертываются вместе с ним. В этом случае вам нужно только объявить
Ява -фляга myapp.jar когда выполняется код.
Поэтому при развертывании главной фляги
в какую-нибудь папку, а потом поместить зависимые JAR-файлы в папке Либ `под манифест выглядит так:
Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar
NB: это не зависит от платформы - мы можем использовать те же баночки для запуска на Unix-сервере или на компьютере с ОС Windows.
Мое решение на Ubuntu 10.04 с помощью Java-солнце 1.6.0_24 имея все банки в "каталог lib и quot;:
в <предварительно&ГТ;Ява -СР .:Либ/* мой.главная.Класс&ЛТ;/пре&ГТ;
Если это не удается, следующая команда должна работать (выдает все *.баночки в lib каталог в classpath парам)
в <предварительно&ГТ;Ява -СР $(для меня в lib/*.фляги ; делать Эхо -N $я: ; сделал). мой.главная.Класс&ЛТ;/пре&ГТ;
Короткий ответ: в Java -classpath в Либ/*:. мой.пакет.Программа
Oracle предоставляет документацию об использовании подстановочных знаков в пути к классам здесь для Java 6 и здесь для Java 7, под заголовок раздела понимание пути к классу шаблоны. (Как я пишу это, две страницы содержат ту же информацию.) Здесь'с резюме основных моментов:
В общем, все баночки в данной директории, вы можете использовать специальный символ *
(не *.фляга
).
Подстановочный знак соответствует только банки, а не Class-файлы; чтобы получить все классы в каталоге, просто прекратить запись classpath на имя каталога.
Этих двух вариантов можно совместить для того чтобы включить все jar и Class файлы в каталоге, и обычные правила приоритета применяются к классам. Е. Г. -СР /классы;/банки/*
В маске, не ищите банки в поддиректориях.
Вышеперечисленные пункты верны, если вы используете классов
системное свойство или -СР
или класса
флаги командной строки. Однако, если вы используете класс-путь манифест заголовок баночку (как вы могли бы сделать с файл сборки Ant), специальные символы будут не будет заслуженный.
Yes, моей первой ссылке-тот же самый, представленная в топ-скоринга ответа (которого у меня нет надежды на обгон), но ответа не'т предоставить больше объяснений за ссылку. Поскольку такого рода поведение discouraged на переполнение стека в эти дни, я думал, что я'd и расширить его.
Окна:&ЛТ;БР/&ГТ;
яз-Баш Ява -СР file.jar;реж/* мой.приложение.Имя_класса
Линукс:&ЛТ;БР/&ГТ;
яз-Баш файл Java-СР.банки:реж/* мой.приложение.Имя_класса
Напоминаю:&ЛТ;БР/&ГТ;
;
&ЛТ;БР/&ГТ;:
&ЛТ;БР/&ГТ;Вы можете попробовать Джава -Джава.ВН.Дирс=jarDirectory
http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html
Каталог внешних банок при запуске Java
Правильно:
java -classpath "lib/*:." my.package.Program
Неправильно:
java -classpath "lib/a*.jar:." my.package.Program
java -classpath "lib/a*:." my.package.Program
java -classpath "lib/*.jar:." my.package.Program
java -classpath lib/*:. my.package.Program
Если вам действительно нужно указать все файлы .jar динамически, вы можете использовать сценарии оболочки или Apache Ant. Существует проект Commons под названием Commons Launcher, который позволяет указать ваш сценарий запуска в качестве файла сборки ant (если вы понимаете, о чем я).
Тогда вы можете указать что-то вроде:
<path id="base.class.path">
<pathelement path="${resources.dir}"/>
<fileset dir="${extensions.dir}" includes="*.jar" />
<fileset dir="${lib.dir}" includes="*.jar"/>
</path>
В вашем файле сборки запуска, который запустит ваше приложение с правильным classpath.
Если вы используете Java 6, то вы можете использовать подстановочные знаки в пути к классу.
Теперь можно использовать символы подстановки в определение классов:
javac -cp libs/* -verbose -encoding UTF-8 src/mypackage/*.java -d build/classes
Обратите внимание, что подстановочных разбивается для Java 7 на Windows.
Проверьте это issue сайте StackOverflow для получения дополнительной информации.
Для решения этой проблемы нужно поставить точку с запятой после подстановки. Ява -СР "и где/*; и quot;
Для кого это может касаться,
Я нашел это странное поведение в Windows под префикса msys/MinGW в раковину.
*Работы:
в <!-- язык: нет --&ГТ;
$ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java
Не'т работу:
в <!-- язык: нет --&ГТ;
$ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
Usage: javac <options> <source files>
use -help for a list of possible options
Я совершенно уверен, что шаблон не расширены оболочки, потому что например
$ echo './*'
./*
(Пробовал с другой программы, а не встроенные в "эхо", с тем же результатом.)
Я считаю, что это'ы и javac
, который пытается развернуть его, и он ведет себя по-разному, существует ли точка с запятой в аргументе или нет. Во-первых, он может пытаться развернуть все аргументы, которые выглядят как тропинки. И только тогда она будет разбирать их, с -СР
берет только маркер. (Обратите внимание, что `com.comsol.aco_1.0.0.jar-вторая баночка в этом каталоге.) Что's все угадать.
Это
$ javac -version
javac 1.7.0
Все вышеперечисленные решения работают здорово, если бы вы разработать и запустить Java-приложение вне IDE, например Eclipse или NetBeans.
Если вы находитесь на Windows 7 и средой разработки Eclipse для разработки на Java, вы можете столкнуться с проблемами при использовании командной строки для запуска класса файлов причине внутри затмения.
Е. Г. Ваш исходный код в Eclipse, имеющих следующую иерархию пакета: edu.sjsu.myapp.Main.java
У вас есть json.jar в качестве внешней зависимости для Main.java
При попытке запуска Main.java из Eclipse, он будет работать без каких-либо проблем.
Но когда вы попытаетесь запустить с помощью командной строки после компиляции Main.java в Eclipse, он будет стрелять какой-то странной ошибки, сказав, что "Ошибка ClassNotDef бла бла" по.
Я предполагаю, что вы находитесь в рабочем каталоге вашего исходного кода !!
Используйте следующий синтаксис, чтобы запустить его из командной строки:
&ГТ;и javac -СР и quot;.;в JSON.банку с" Main.java
&ГТ;Ява -СР и quot;.;в JSON.банку" по Эду.sjsu.приложение myapp.Главная
[Дон'т пропустите . выше]
Это потому, что вы разместили Main.java внутри пакета еду.sjsu.myapp и java.exe буду искать точный шаблон.
Надеюсь, что это помогает !!
Сокращенная форма: Если в банке, вы'будете, вероятно, нужно еще '-фляга pathTo/yourJar/YourJarsName.jar ' явно, чтобы заставить его работать (хотя 'YourJarsName.опарник' был в classpath) (или, выразил, чтобы ответить на исходный вопрос, который был задан 5 лет назад: вы не'т нужно явно объявить каждую банку, но, кажется, даже с java6 вы должны переопределить свои фляги ...)
Длинное Форма: (Я'ве сделал это явно до того, что я надеюсь, даже незваного гостя на Java может воспользоваться этим)
Как и многие здесь, я'м с помощью Eclipse для экспорта банок: (Файл->экспорт--&ГТ;'готов к запуску jar-файл'). Есть три варианта на 'транспортная обработка библиотека' затмение (Юнона) предлагает:
opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"
Как правило, я'd с помощью параметр2 (и параметр1 точно было нарушение), однако машинный код в одной из баночек я'м через я обнаружил разрывы с удобной и quot;jarinjar" и трюк, что Eclipse использует, когда вы выбираете эту опцию. Даже поняв, что мне нужно параметр3, а затем найти в этом сайте StackOverflow запись, он все-таки взял меня некоторое время, чтобы выяснить, как запустить мой главный из Eclipse, так вот's то, что работал для меня, как это's полезный для других...
Если вы назвали ваш банку: "и fooBarTheJarFile.банку" и и все имеет значение экспорта в Реж: " и/theFully/qualifiedPath/toYourChosenDir и quot;.
(имеется в виду 'экспортного' поле читать: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.опарник' )
После того, как вы нажмете готово, вы'll найти то затмение ставит все библиотеки в папку с названием 'fooBarTheJarFile_lib' в этой директории экспорта, давая вам что-то вроде:
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar
Затем вы можете запустить в любом месте на вашей системе с:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(Для Java начинающих: 'упаковка.path_to.the_class_with.your_main' - это объявленное пакет-путь, который вы'll найти вверху 'TheClassWithYourMain.Ява' файл, содержащий 'основные(string[] аргументы){...}' что вы хотите запустить извне Ява)
Ловушка заметить: - это что, 'fooBarTheJarFile.опарник' в списке банки на заявленные classpath-это не достаточно. Вы должны явно объявить ' банка', и переобъявить эти банки.
например, это нарушает:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain
пересчитано с относительными путями:
cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS: java -cp "fooBarTheJarFile_lib/*" package.path_to.the_class_with.your_main.TheClassWithYourMain
BREAKS: java -cp ".;fooBarTheJarFile_lib/*" package.path_to.the_class_with.your_main.TheClassWithYourMain
BREAKS: java -cp ".;fooBarTheJarFile_lib/*" -jar package.path_to.the_class_with.your_main.TheClassWithYourMain
WORKS: java -cp ".;fooBarTheJarFile_lib/*" -jar fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(используя Java версии "и 1.6.0_27 и quot;; через OpenJDK 64-разрядной виртуальной машины сервера на Ubuntu 12.04)
класс от wepapp:
> mvn clean install
> java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2
Единственный способ я знаю, как сделать это индивидуально, например:
setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.
Надеюсь, что помогает!
Не прямое решение, чтобы быть в состоянии установить /* к -СР, но я надеюсь, что вы могли бы использовать следующий скрипт, чтобы облегчить ситуацию немного для динамического класса-пути и lib.
libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use ~> java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi;
Сценарий для Linux, может есть подобное для Windows. Если соответствующий каталог предоставляется в качестве входных данных в "libDir2Scan4jars и quot;; скрипт будет сканировать все баночки и создания classpath строку и экспортировать его в env переменную "и tmpCLASSPATH и quot;.
Вам нужно добавить их все по отдельности. В качестве альтернативы, если вам действительно нужно указать только каталог, вы можете разархивировать все в один каталог и добавить его в classpath. Однако я не рекомендую такой подход, так как вы рискуете получить странные проблемы с версионированием и неуправляемостью classpath.