Включение всех jar-файлов в каталог в пути к классам Java

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

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


person Chris Serra    schedule 20.10.2008    source источник
comment
Извините, я никогда не принимал это. Это должна быть вики сообщества. Ни разу не использовал ни один из предоставленных ответов. Я считаю, что создал сценарий оболочки, который просто просканировал каталог lib / и создал путь к классам на основе синтаксического анализа имен файлов.   -  person Chris Serra    schedule 28.03.2011
comment
В этой новой функции Java есть какая-то ошибка, потому что она не работает, как описано. Я сдался и использовал Ant, чтобы обойти это, как описано в одном из ответов.   -  person Alex R    schedule 03.04.2011
comment
В Windows есть проблема с обработкой подстановочных знаков. stackoverflow.com/questions/ 11607873 /   -  person Mike    schedule 23.07.2012
comment
Сначала я подумал, что . после jar: поставлен по ошибке, но ..... Стандартным символом для `текущего каталога 'является одиночная точка (.) Как в системах Unix, так и в Windows.   -  person KNU    schedule 20.11.2014
comment
Краткий ответ: (1) отбросьте .jar часть, (2) должно быть как минимум 2 части, разделенные ; в Windows (что обычно : в другом месте). Например: java -classpath ".;lib/*" Program   -  person Evgeni Sergeev    schedule 12.12.2014
comment
Очень извините, но поскольку это популярный вопрос, и я не могу задать свой вопрос, я ищу ответ эксперта по Java, чтобы узнать, в чем разница между флагом create и create new здесь github.com/frohoff/jdk8u-jdk/blob/master/src / solaris / classes /   -  person Sagar Kharab    schedule 24.06.2021


Ответы (25)


При использовании Java 6 или более поздней версии параметр classpath поддерживает подстановочные знаки. Обратите внимание на следующее:

  • Используйте прямые кавычки (")
  • Используйте *, а не *.jar

Windows

java -cp "Test.jar;lib/*" my.package.MainClass

Unix

java -cp "Test.jar:lib/*" my.package.MainClass

Это похоже на Windows, но использует : вместо ;. Если вы не можете использовать подстановочные знаки, bash разрешает следующий синтаксис (где lib - это каталог, содержащий все файлы архива Java):

java -cp "$(printf %s: lib/*.jar)"

(Обратите внимание, что использование пути к классам несовместимо с параметром -jar. См. Также: Запустить файл jar с несколькими библиотеками пути к классам из командной строки)

Что такое подстановочные знаки

Из документа Classpath:

Записи пути к классу могут содержать подстановочный знак базового имени *, который считается эквивалентным указанию списка всех файлов в каталоге с расширением .jar или .JAR. Например, запись пути к классу foo/* указывает все файлы JAR в каталоге с именем foo. Запись пути к классам, состоящая просто из *, расширяется до списка всех файлов jar в текущем каталоге.

Запись пути к классу, содержащая *, не будет соответствовать файлам классов. Чтобы сопоставить классы и файлы JAR в одном каталоге foo, используйте foo;foo/* или foo/*;foo. Выбранный порядок определяет, загружаются ли классы и ресурсы в foo перед файлами JAR в foo или наоборот.

Поиск в подкаталогах рекурсивно не выполняется. Например, foo/* ищет файлы JAR только в foo, а не в foo/bar, foo/baz и т. Д.

Порядок, в котором файлы JAR в каталоге перечислены в расширенном пути к классам, не указан и может варьироваться от платформы к платформе и даже от момента к моменту на одной и той же машине. Хорошо построенное приложение не должно зависеть от какого-либо конкретного порядка. Если требуется определенный порядок, файлы JAR могут быть явно перечислены в пути к классам.

Расширение подстановочных знаков выполняется раньше, до вызова основного метода программы, а не поздно, во время самого процесса загрузки класса. Каждый элемент пути входного класса, содержащий подстановочный знак, заменяется (возможно, пустой) последовательностью элементов, сгенерированной путем перечисления файлов JAR в указанном каталоге. Например, если каталог foo содержит a.jar, b.jar и c.jar, то путь к классу foo/* расширяется до foo/a.jar;foo/b.jar;foo/c.jar, и эта строка будет значением системного свойства java.class.path.

Переменная среды CLASSPATH не обрабатывается иначе, чем параметр командной строки -classpath (или -cp). То есть во всех этих случаях используются подстановочные знаки. Однако подстановочные знаки пути к классам не учитываются в заголовке Class-Path jar-manifest.

Примечание: из-за известной ошибки в java 8 в примерах Windows должна использоваться обратная косая черта перед записями с завершающей звездочкой: https://bugs.openjdk.java.net/browse/JDK-8131329

person basszero    schedule 20.10.2008
comment
На самом деле мы сейчас используем Java 5. Но это полезно знать на будущее, спасибо за подсказку! - person Chris Serra; 21.10.2008
comment
Потрясающие. У меня работает что-то вроде этого: java -cp target / classes; target / lib / * de.byteconsult.Main - person Tom; 19.11.2010
comment
Эта функция плохо документирована и, похоже, требует выполнения некоторых менее чем очевидных предварительных условий, чтобы она работала должным образом. - person Alex R; 03.04.2011
comment
Лорд Торгамус ниже приводит пример и объяснение. - person Ellen Spertus; 12.06.2012
comment
Вы также можете использовать find: cp=$(find /path/to/std/jars /path/to/your/jar -not -type d -printf "%p:") - person JohnnyLambada; 16.08.2012
comment
+1 за последний трюк bash / tr. Java / JamVM здесь не любит подстановочные знаки для путей за пределами рабочего каталога, но явная ссылка на каждый JAR с помощью подстановочного символа оболочки + tr работает! - person Supr; 15.05.2013
comment
У меня есть команда java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass без кавычек, и она отлично работает. Мне интересно, почему оболочка не расширяет ее и не выдает ошибки? - person yellavon; 03.03.2014
comment
Помните, что java -cp "Test.jar;lib/*" my.package.MainClass работает, но если параметр classpath указан как второй аргумент, он не работает (java my.package.MainClass -cp "Test.jar;lib/*"). - person AndiDog; 26.03.2015
comment
Также не используйте ~ в -cp - person Sohail Si; 10.08.2015
comment
Следующее также недействительно java -cp = как вы используете в set classpath = - person manifold; 18.07.2016
comment
В bash следует использовать одинарные кавычки - person Konstantin Pelepelin; 05.05.2018
comment
Ваш пример Windows не работает с java 8 или более ранней версией, но будет с этим путем к классам: Test.jar; lib \ * ... косая черта в порядке, кроме случаев, когда перед звездочкой и некоторыми другими ... см. bugs.openjdk.java.net/browse/JDK-8131329 - person philwalk; 18.07.2018
comment
В Cygwin нам нужно использовать разделитель точка с запятой (;) вместо двоеточия (:) - person Peter; 19.06.2019
comment
@basszero С двойными кавычками, он работал на MacOS 10.15.2 Catalina. Спасибо :) +1 за это. - person Anish B.; 04.01.2020
comment
как насчет более старой версии, чем java 6 @basszero - person Aman; 21.03.2020
comment
java -cp Test.jar; lib / * my.package.MainClass не будет ли это искать дочерние папки в lib? Например, моя банка находится в каталоге lib / org / abc.jar - person Hardik Rana; 20.08.2020

Под Windows это работает:

java -cp "Test.jar;lib/*" my.package.MainClass

и это не работает:

java -cp "Test.jar;lib/*.jar" my.package.MainClass

Обратите внимание на *.jar, поэтому подстановочный знак * следует использовать отдельно.


В Linux работает следующее:

java -cp "Test.jar:lib/*" my.package.MainClass

Разделителями являются двоеточия вместо точки с запятой.

person davorp    schedule 14.08.2009
comment
Идеальный ответ. 2 важных момента, на которые следует обратить внимание: 1) Используйте кавычки и 2) Используйте только *, а не * .jar - person Wim Deblauwe; 03.12.2012
comment
Год и 8 месяцев спустя редактирование, которое я сделал, чтобы включить версию для UNIX, снова спасло меня. :) Забавно, что мои файлы jar не распознаются с *.jar, а только с *. - person jmort253; 29.09.2013
comment
Я обнаружил, что порядок путей к классам важен (но я не знаю почему). Я получал ошибки, пока не поменял порядок путей к классам. - person user13107; 19.03.2014
comment
@ jmort253, дело в том, что это не оболочка * расширяется, а подстановочный знак - это java, анализирующая путь к классам, видя * и заполняя подстановочный знак - person Sebastian; 08.05.2014
comment
@SebastianGodelet - Ага, просто я запутался между подстановочными знаками Regex и этой нотацией, что, я думаю, не одно и то же. В основном меня спасало знание разницы между : на одной платформе и ; на другой. :) Я компилирую Java из командной строки примерно раз в год, ровно столько, чтобы не вспоминать, сколько еще достаточно, чтобы раздражать. - person jmort253; 08.05.2014
comment
java -cp Test.jar; lib / * my.package.MainClass не будет ли это искать дочерние папки в lib? Например, моя банка находится в каталоге lib / org / abc.ja - person Hardik Rana; 20.08.2020

Мы обходим эту проблему, развертывая основной файл jar myapp.jar, который содержит файл manifest (Manifest.mf), в котором указывается путь к классам с другими необходимыми файлами jar, которые затем развертываются вместе с ним. В этом случае вам нужно только объявить java -jar myapp.jar при запуске кода.

Итак, если вы развернете основной jar в какой-то каталог, а затем поместите зависимые банки в папку lib под ним, манифест будет выглядеть так:

Manifest-Version: 1.0
Implementation-Title: myapp
Implementation-Version: 1.0.1
Class-Path: lib/dep1.jar lib/dep2.jar

NB: это не зависит от платформы - мы можем использовать одни и те же jar-файлы для запуска на сервере UNIX или на ПК с Windows.

person oxbow_lakes    schedule 20.10.2008
comment
Кажется, что это работает для многих людей, однако Java, похоже, просто игнорирует записи Class-Path в файле манифеста здесь. Мы не можем запустить приложение, не добавив вручную lib / * в путь к классам с помощью -cp. Любые идеи? - person Raku; 12.10.2011
comment
Ответ oxbow_lakes не совсем правильный; объект Class-Path соблюдается (и ТОЛЬКО это соблюдается; -cp / -classpath игнорируется!), если вы запускаете эту банку с java -jar myapp.jar. Я полагаю, что oxbow_lakes хотел написать это, когда писал «java -classpath myapp.jar». - person rzwitserloot; 08.01.2013

Мое решение на Ubuntu 10.04 с использованием java-sun 1.6.0_24 со всеми банками в каталоге "lib":

java -cp .:lib/* my.main.Class

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

java -cp $(for i in lib/*.jar ; do echo -n $i: ; done). my.main.Class
person Habi    schedule 17.03.2011
comment
забавная записка. java -cp lib / * my.main.Class всегда будет терпеть неудачу, потому что расширение glob оболочки для lib / *, в то время как java -cp.: lib / * my.main.Class не будет, потому что.: lib / * не является допустимым glob дорожка. Обратите внимание на то, что - person albfan; 23.03.2012
comment
Это не работает; linux расширит . вы можете попробовать: java -cp '.: lib /', и это отлично работает (обратите внимание на одинарные кавычки! С двойными кавычками это не сработает!). На самом деле,.: Lib / * может работать, если это недопустимый глобус из-за двоеточия, но это кажется немного ненадежным. Я бы добавил цитаты. Одиночные кавычки говорят bash не касаться какой-либо части содержимого. - person rzwitserloot; 08.01.2013
comment
Не имеет значения (в данном контексте), используете ли вы одинарные или двойные кавычки. Вы хотите, чтобы оболочка не расширяла (подтасовывала) символ *, вот и все. И передайте текст lib / * в JVM буквально, чтобы виртуальная машина распознала это как особый шаблон и самостоятельно начала поиск файлов jar. - person Angel O'Sphere; 30.05.2016

Краткий ответ: java -classpath lib/*:. my.package.Program

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

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

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

  • Вышеупомянутые два параметра могут быть объединены для включения всех файлов JAR и классов в каталог, при этом применяются обычные правила приоритета пути к классам. Например. -cp /classes;/jars/*

  • Подстановочный знак не выполняет поиск файлов JAR в подкаталогах.

  • Вышеупомянутые пункты списка верны, если вы используете системное свойство CLASSPATH или флаги командной строки -cp или -classpath. Однако, если вы используете Class-Path заголовок манифеста JAR (как вы могли бы это сделать с файлом сборки ant), подстановочные знаки не будут учитываться.

Да, моя первая ссылка та же, что и в ответе, получившем наибольшее количество баллов (который у меня нет надежды обогнать), но этот ответ не дает подробного объяснения, кроме ссылки. Поскольку такое поведение не рекомендуется в наши дни в Stack Overflow, я подумал, что смогу расширить его.

person Pops    schedule 21.12.2011
comment
моя проблема была с lib / *. jar, а не с lib / *. Большое спасибо, что это исправлено. Я заметил разницу между: и; но это могло быть моим делом «тестирование множества изменений одновременно». - person Eyad Ebrahim; 19.09.2012
comment
Спасибо, что подчеркнули разницу между * и * .jar - person burak; 10.08.2018
comment
Я не уверен, зачем нужна дополнительная запись пути к классам. исправил мою проблему, но теперь он работает. . - это тот же каталог, что и каталог, который я указал с подстановочным знаком. Я не понимаю, почему это имеет значение, но это имело значение. Спасибо! - person Datbates; 20.07.2020

Windows:

 java -cp file.jar;dir/* my.app.ClassName

Linux:

 java -cp file.jar:dir/* my.app.ClassName

Напоминание:
- Разделитель путей в Windows - ;
- Разделитель путей в Linux - :
- В Windows, если аргумент cp не содержит белого цвета пробел, "кавычки" необязательны

person Wender    schedule 18.07.2016
comment
пример Windows не работает для java 8 и более ранних версий: см. bugs.openjdk.java.net / browse / JDK-8131329 - person philwalk; 18.07.2018
comment
Возможно, не работает для открытого JDK, я протестирую это и расскажу здесь - person Wender; 18.07.2018
comment
Извините, я тестировал HotSpot и думал, что он работает с openjdk. - person Wender; 17.09.2018
comment
Oracle java под Windows требует обратной косой черты перед звездочкой, а не прямой косой черты, хотя я не повторно тестировал самые последние или альтернативные версии java. - person philwalk; 21.09.2018
comment
java -cp Test.jar; lib / * my.package.MainClass не будет ли это искать дочерние папки в lib? Например, моя банка находится в каталоге lib / org / abc.ja - person Hardik Rana; 20.08.2020

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

java -cp "/lib/*;" sample

Для linux

java -cp "/lib/*:" sample

Я использую Java 6

person SANN3    schedule 15.10.2012
comment
пример Windows, похоже, работал для java 6, возможно, java 7, но не для java 8 (см. bugs.openjdk.java.net/browse/JDK-8131329) - person philwalk; 18.07.2018
comment
Работает для java 8 в linux - person Jonathan Drapeau; 11.01.2019
comment
java -cp Test.jar; lib / * my.package.MainClass не будет ли это искать дочерние папки в lib? Например, моя банка находится в каталоге lib / org / abc.ja - person Hardik Rana; 20.08.2020

Вы можете попробовать java -Djava.ext.dirs=jarDirectory http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html.

Каталог для внешних jar-файлов при запуске java

person Navi    schedule 06.03.2010
comment
Это работает, но будьте осторожны, передайте -Djava.ext.dirs= ПЕРЕД -jar - person Giovanni Funchal; 04.06.2010
comment
java.ext.dirs будет работать совсем иначе, чем обычный jar в пути к классам. У него более высокий приоритет и разрешение, которое сможет каким-то образом переопределить классы в bootstamp (rt.jar). - person Dennis C; 30.11.2010
comment
Спасибо. В «java версии 1.8.0_221 Java (TM) SE Runtime Environment (build 1.8.0_221-b27) Java HotSpot (TM) 64-Bit Server VM (build 25.221-b27, смешанный режим)», только эта версия -D передает в пути к классам работал. Традиционная форма - нет. - person Matt Campbell; 06.11.2019

Верно:

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
person rvernica    schedule 13.02.2012
comment
java -classpath lib / * :. my.package.Program у меня работает - person Mugeesh Husain; 11.06.2020

Если вы используете 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/

person prakash    schedule 01.11.2010

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

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

<path id="base.class.path">
    <pathelement path="${resources.dir}"/>
    <fileset dir="${extensions.dir}" includes="*.jar" />
    <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

В вашем файле сборки запуска, который запустит ваше приложение с правильным путем к классам.

person Community    schedule 20.10.2008

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

Дополнительную информацию см. В этой проблеме StackOverflow.

Обходной путь - поставить точку с запятой сразу после подстановочного знака. java -cp "somewhere/*;"

person Jake Toronto    schedule 13.09.2013

Для предъявления по месту требования,

Я обнаружил это странное поведение в 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 './*'
./*

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

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

Это

$ javac -version
javac 1.7.0
person Evgeni Sergeev    schedule 12.12.2014

Все вышеперечисленные решения отлично работают, если вы разрабатываете и запускаете приложение Java вне любой IDE, такой как Eclipse или Netbeans.

Если вы работаете в Windows 7 и используете Eclipse IDE для разработки на Java, вы можете столкнуться с проблемами при использовании командной строки для запуска файлов классов, созданных внутри Eclipse.

Например. Ваш исходный код в Eclipse имеет следующую иерархию пакетов: edu.sjsu.myapp.Main.java

У вас есть json.jar как внешняя зависимость для Main.java

Когда вы пытаетесь запустить Main.java из Eclipse, он будет работать без каких-либо проблем.

Но когда вы попытаетесь запустить это с помощью командной строки после компиляции Main.java в Eclipse, он выдаст несколько странных ошибок, в которых говорится: «Ошибка ClassNotDef, бла-бла».

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

Используйте следующий синтаксис для запуска из командной строки:

  1. # P9 #
  2. # P10 #
    # P11 #

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

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

person Community    schedule 21.11.2011

Для окон требуются кавычки и; следует использовать как разделитель. например.:

java -cp "target\\*;target\\dependency\\*" my.package.Main
person Alexey    schedule 25.12.2009

Краткая форма: если ваш main находится внутри jar, вам, вероятно, понадобится дополнительный '-jar pathTo / yourJar / YourJarsName.jar', явно объявленный, чтобы заставить его работать (даже если 'YourJarsName.jar' был в пути к классам) (или , выраженный в ответ на исходный вопрос, заданный 5 лет назад: вам не нужно повторно объявлять каждую банку явно, но кажется, что даже с java6 вам нужно повторно объявить свою собственную банку ...)


Длинная форма: (я сделал это явным до такой степени, что надеюсь, что даже нарушители Java могут использовать это)

Как и многие здесь, я использую eclipse для экспорта jar-файлов: (Файл-> Экспорт -> «Запускаемый файл JAR»). В eclipse (Juno) есть три варианта работы с библиотекой:

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"

Обычно я использовал opt2 (а opt1 определенно ломался), однако в собственном коде одной из используемых мною jar-файлов я обнаружил разрывы с помощью удобного трюка jarinjar, который eclipse использует, когда вы выбираете этот вариант. Даже после того, как я понял, что мне нужен opt3, а затем нашел эту запись в StackOverflow, мне все же потребовалось некоторое время, чтобы понять, как запустить мой main за пределами eclipse, поэтому вот что сработало для меня, так как это полезно для других ...


Если вы назвали свою банку: «fooBarTheJarFile.jar» и все настроено на экспорт в каталог: «/ theFully / qualifiedPath / toYourChosenDir».

(это означает, что в поле «Место назначения экспорта» будет указано: «/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar»)

После того, как вы нажмете «Готово», вы обнаружите, что eclipse помещает все библиотеки в папку с именем 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: 'package.path_to.the_class_with.your_main' - это объявленный путь к пакету, который вы найдете в верхней части файла 'TheClassWithYourMain.java', который содержит 'main (String [] args) {.. .} ', который вы хотите запустить извне java)


Обратите внимание на ловушку: недостаточно иметь 'fooBarTheJarFile.jar' в списке jar-файлов в объявленном пути к классам. Вам нужно явно объявить '-jar' и повторно объявить местоположение этого jar-файла.

например это ломается:

 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"; через виртуальную машину 64-разрядного сервера OpenJDK в ubuntu 12.04)

person Matt S.    schedule 29.06.2013

macOS, текущая папка

Для Java 13 в macOS Mojave

Если все ваши .jar файлы находятся в одной папке, используйте cd, чтобы сделать это своим текущий рабочий каталог. Подтвердите с помощью pwd.

Для -classpath вы должны сначала указать файл JAR для своего приложения. Используя символ двоеточия : в качестве разделителя, добавьте звездочку *, чтобы получить все остальные файлы JAR в той же папке. Наконец, передайте полное имя пакета класса с помощью вашего main метода.

Например, для приложения в файле JAR с именем my_app.jar с методом main в классе с именем App в пакете с именем com.example вместе с некоторыми необходимыми банками в той же папке:

java -classpath my_app.jar:* com.example.App
person Basil Bourque    schedule 09.11.2019

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

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

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

person ParseTheData    schedule 05.12.2008
comment
Возможно, это был единственный путь в 2008 году, но не сейчас. - person simo.3792; 09.10.2014
comment
Это не самое страшное. Это хак, но у меня в bashrc есть такой набор for jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done - person Devon Peticolas; 07.04.2015

класс из 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
person Mindaugas K.    schedule 29.04.2015

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

person Daniel Spiewak    schedule 20.10.2008
comment
Возможно, это был единственный путь в 2008 году, но не сейчас. - person simo.3792; 09.10.2014

Это не прямое решение для возможности установить / * в -cp, но я надеюсь, что вы могли бы использовать следующий сценарий, чтобы немного облегчить ситуацию для динамических путей к классам и каталогов 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"; сценарий просканирует все jar-файлы, создаст строку пути к классам и экспортирует ее в переменную env "tmpCLASSPATH".

person Sreesankar    schedule 27.06.2016

Думайте о файле jar как о корне структуры каталогов. Да, вам нужно добавить их все по отдельности.

person Robert Van Hoose    schedule 20.10.2008

Установите путь к классам подходящим образом для нескольких jar-файлов и файлов классов текущего каталога.

CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar; 
CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
export CLASSPATH
person Girdhar Singh Rathore    schedule 30.06.2016

У меня в папке несколько банок. Приведенная ниже команда работала для меня в JDK1.8, чтобы включить все банки, присутствующие в папке. Обратите внимание, что для включения в кавычки, если у вас есть пробел в пути к классам

Windows

Компиляция: javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java

Бег: java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram

Linux

Компиляция: javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java

Бег: java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram

person vkrams    schedule 14.03.2019

Также важен порядок аргументов команды java:

c:\projects\CloudMirror>java Javaside -cp "jna-5.6.0.jar;.\"
Error: Unable to initialize main class Javaside
Caused by: java.lang.NoClassDefFoundError: com/sun/jna/Callback

против

c:\projects\CloudMirror>java -cp "jna-5.6.0.jar;.\" Javaside
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable
person kellogs    schedule 27.01.2021