Включение всех банок в каталог в пределах пути классов Java

Есть ли способ включить все jar-файлы в каталоге в classpath?

Я пробую java -classpath lib/*.jar:. my.package.Program и он не может найти файлы классов, которые, конечно же, находятся в этих банках. Нужно ли мне добавить каждый jar-файл в classpath отдельно?

Комментарии к вопросу (6)

Используя 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

Комментарии (13)

Под 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

Сепараторы двоеточие вместо точки с запятой.

Комментарии (6)

Мы можем обойти эту проблему путем развертывания основные 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.

Комментарии (2)

Мое решение на Ubuntu 10.04 с помощью Java-солнце 1.6.0_24 имея все банки в "каталог lib и quot;:

в <предварительно&ГТ;Ява -СР .:Либ/* мой.главная.Класс&ЛТ;/пре&ГТ;

Если это не удается, следующая команда должна работать (выдает все *.баночки в lib каталог в classpath парам)

в <предварительно&ГТ;Ява -СР $(для меня в lib/*.фляги ; делать Эхо -N $я: ; сделал). мой.главная.Класс&ЛТ;/пре&ГТ;

Комментарии (4)

Короткий ответ: в Java -classpath в Либ/*:. мой.пакет.Программа

Oracle предоставляет документацию об использовании подстановочных знаков в пути к классам здесь для Java 6 и здесь для Java 7, под заголовок раздела понимание пути к классу шаблоны. (Как я пишу это, две страницы содержат ту же информацию.) Здесь'с резюме основных моментов:

  • В общем, все баночки в данной директории, вы можете использовать специальный символ * (не *.фляга).

  • Подстановочный знак соответствует только банки, а не Class-файлы; чтобы получить все классы в каталоге, просто прекратить запись classpath на имя каталога.

  • Этих двух вариантов можно совместить для того чтобы включить все jar и Class файлы в каталоге, и обычные правила приоритета применяются к классам. Е. Г. -СР /классы;/банки/*

  • В маске, не ищите банки в поддиректориях.

  • Вышеперечисленные пункты верны, если вы используете классов системное свойство или -СР или класса флаги командной строки. Однако, если вы используете класс-путь манифест заголовок баночку (как вы могли бы сделать с файл сборки Ant), специальные символы будут не будет заслуженный.

Yes, моей первой ссылке-тот же самый, представленная в топ-скоринга ответа (которого у меня нет надежды на обгон), но ответа не'т предоставить больше объяснений за ссылку. Поскольку такого рода поведение discouraged на переполнение стека в эти дни, я думал, что я'd и расширить его.

Комментарии (2)

Для меня это работает в Windows .

java -cp "/lib/*;" sample

Для Linux

java -cp "/lib/*:" sample

Я использую Ява 6

Комментарии (3)

Окна:&ЛТ;БР/&ГТ; яз-Баш Ява -СР file.jar;реж/* мой.приложение.Имя_класса

Линукс:&ЛТ;БР/&ГТ; яз-Баш файл Java-СР.банки:реж/* мой.приложение.Имя_класса

Напоминаю:&ЛТ;БР/&ГТ;

  • Окна сепаратор путь ;&ЛТ;БР/&ГТ;
  • Линукс сепаратор путь :&ЛТ;БР/&ГТ;
  • В Windows если аргумент СР не содержит пробелов, в "цитаты" это необязательно
Комментарии (4)

Вы можете попробовать Джава -Джава.ВН.Дирс=jarDirectory http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html

Каталог внешних банок при запуске Java

Комментарии (4)

Правильно:

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
Комментарии (0)

Если вам действительно нужно указать все файлы .jar динамически, вы можете использовать сценарии оболочки или [Apache Ant][1]. Существует проект Commons под названием [Commons Launcher][2], который позволяет указать ваш сценарий запуска в качестве файла сборки ant (если вы понимаете, о чем я).

Тогда вы можете указать что-то вроде:


<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
Комментарии (0)

Если вы используете Java 6, то вы можете использовать подстановочные знаки в пути к классу.

Теперь можно использовать символы подстановки в определение классов:

javac -cp libs/* -verbose -encoding UTF-8 src/mypackage/*.java  -d build/classes

Реф: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/

Комментарии (0)

Обратите внимание, что подстановочных разбивается для Java 7 на Windows.

Проверьте это issue сайте StackOverflow для получения дополнительной информации.

Для решения этой проблемы нужно поставить точку с запятой после подстановки. Ява -СР "и где/*; и quot;

Комментарии (0)

Для кого это может касаться,

Я нашел это странное поведение в 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  
use -help for a list of possible options

Я совершенно уверен, что шаблон не расширены оболочки, потому что например

$ echo './*'
./*

(Пробовал с другой программы, а не встроенные в "эхо", с тем же результатом.)

Я считаю, что это'ы и javac, который пытается развернуть его, и он ведет себя по-разному, существует ли точка с запятой в аргументе или нет. Во-первых, он может пытаться развернуть все аргументы, которые выглядят как тропинки. И только тогда она будет разбирать их, с -СР берет только маркер. (Обратите внимание, что `com.comsol.aco_1.0.0.jar-вторая баночка в этом каталоге.) Что's все угадать.

Это

$ javac -version
javac 1.7.0
Комментарии (1)

Все вышеперечисленные решения работают здорово, если бы вы разработать и запустить 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 бла бла" по.

Я предполагаю, что вы находитесь в рабочем каталоге вашего исходного кода !!

Используйте следующий синтаксис, чтобы запустить его из командной строки:

  1. &ГТ;и javac -СР и quot;.;в JSON.банку с" Main.java

  2. &ГТ;Ява -СР и quot;.;в JSON.банку" по Эду.sjsu.приложение myapp.Главная

[Дон'т пропустите . выше]

Это потому, что вы разместили Main.java внутри пакета еду.sjsu.myapp и java.exe буду искать точный шаблон.

Надеюсь, что это помогает !!

Комментарии (0)

Для Windows, кавычки обязательны и должны быть использованы в качестве разделителя. например:

java -cp "target\\*;target\\dependency\\*" my.package.Main
Комментарии (0)

Сокращенная форма: Если в банке, вы'будете, вероятно, нужно еще '-фляга 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)

Комментарии (0)

класс от 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
Комментарии (0)

Единственный способ я знаю, как сделать это индивидуально, например:

setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.

Надеюсь, что помогает!

Комментарии (2)

Не прямое решение, чтобы быть в состоянии установить /* к -СР, но я надеюсь, что вы могли бы использовать следующий скрипт, чтобы облегчить ситуацию немного для динамического класса-пути и 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;.

Комментарии (0)

Вам нужно добавить их все по отдельности. В качестве альтернативы, если вам действительно нужно указать только каталог, вы можете разархивировать все в один каталог и добавить его в classpath. Однако я не рекомендую такой подход, так как вы рискуете получить странные проблемы с версионированием и неуправляемостью classpath.

Комментарии (1)