Есть ли способ включить все файлы JAR в каталог в classpath?
Я пытаюсь, java -classpath lib/*.jar:. my.package.Program
и он не может найти файлы классов, которые, безусловно, в этих банках. Нужно ли добавлять каждый jar-файл в classpath отдельно?
java
command-line
classpath
Крис Серра
источник
источник
.jar
деталь, (2) должно быть как минимум 2 части, разделенные;
на Windows (как правило, в:
другом месте). Например:java -classpath ".;lib/*" Program
Ответы:
Используя Java 6 или новее, опция classpath поддерживает подстановочные знаки. Обратите внимание на следующее:
"
)*
, а не*.jar
Windows
Юникс
Это похоже на Windows, но использует
:
вместо;
. Если вы не можете использовать подстановочные знаки,bash
допускается следующий синтаксис (гдеlib
находится каталог, содержащий все архивные файлы Java):(Обратите внимание, что использование пути к классам несовместимо с этой
-jar
опцией. См. Также: Выполнение файла JAR с несколькими библиотеками путей к классам из командной строки )Понимание подстановочных знаков
Из документа Classpath :
Примечание: из-за известной ошибки в java 8 примеры Windows должны использовать обратную косую черту, предшествующую записи с завершающей звездочкой: https://bugs.openjdk.java.net/browse/JDK-8131329
источник
tr
работает!java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass
без кавычек, и она отлично работает. Мне интересно, почему оболочка не расширяет и не выдает ошибку?~
в -cpПод окнами это работает:
и это не работает
обратите внимание на * .jar, поэтому подстановочный знак * должен использоваться один .
В Linux работает следующее:
Разделителями являются двоеточия, а не точки с запятой.
источник
*.jar
но только с помощью*
.:
одной платформой и;
другой. :) Я компилирую Java из командной строки примерно раз в год, достаточно, чтобы не вспоминать, как часто, достаточно часто, чтобы раздражать.Мы можем обойти эту проблему, развернув основной файл jar,
myapp.jar
который содержит файл manifest (Manifest.mf
), в котором указан путь к классу с другими необходимыми файлами jar , которые затем развертываются вместе с ним. В этом случае вам нужно только объявитьjava -jar myapp.jar
при запуске кода.Так что, если вы развернете основной файл
jar
в какой-либо каталог, а затем поместите зависимые файлы jar вlib
папку под ним, манифест будет выглядеть так:Примечание: это не зависит от платформы - мы можем использовать одни и те же файлы jar для запуска на сервере UNIX или на ПК с Windows.
источник
Мое решение на Ubuntu 10.04 с использованием java-sun 1.6.0_24, содержащее все jar-файлы в каталоге "lib":
В случае неудачи сработает следующая команда (выводит все * .jars в каталоге lib в параметр classpath)
источник
Короткий ответ:
java -classpath lib/*:. my.package.Program
Oracle предоставляет документацию по использованию подстановочных знаков в classpath здесь для Java 6 и здесь для Java 7 , в разделе, озаглавленном Понимание подстановочных знаков пути к классам . (Когда я пишу это, две страницы содержат одинаковую информацию.) Вот краткое изложение основных моментов:
В общем, чтобы включить все JAR-файлы в данный каталог, вы можете использовать подстановочный знак
*
( не*.jar
).Подстановочный знак соответствует только файлам JAR, а не файлам классов; чтобы получить все классы в каталоге, просто закройте запись classpath в имени каталога.
Два вышеупомянутых параметра можно объединить, чтобы включить все файлы JAR и классов в каталог, и применяются обычные правила приоритета пути к классам. Например
-cp /classes;/jars/*
Подстановочный знак не будет искать JAR-файлы в подкаталогах.
Вышеуказанные маркеры верны, если вы используете
CLASSPATH
системное свойство или флаги командной строки-cp
или-classpath
. Однако, если вы используетеClass-Path
заголовок манифеста JAR (как вы могли бы сделать с файлом сборки ant), подстановочные знаки не будут учитываться.Да, моя первая ссылка такая же, как и в ответе с наивысшей оценкой (который я не надеюсь обгонять), но этот ответ не дает большого объяснения помимо ссылки. Поскольку в наши дни такое поведение не рекомендуется использовать в Stack Overflow , я решил расширить его.
источник
Windows :
Linux :
Напомним:
- Разделитель пути Windows -
;
- Разделитель пути Linux -
:
- В Windows, если аргумент cp не содержит пробелов, «кавычки» необязательны
источник
Для меня это работает в Windows.
Для Linux
Я использую Java 6
источник
Вы можете попробовать Java
-Djava.ext.dirs=jarDirectory
http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.htmlКаталог для внешних банок при запуске Java
источник
-Djava.ext.dirs=
ДО-jar
Исправить :
Неправильно:
источник
Если вам действительно нужно указать все файлы .jar динамически, вы можете использовать сценарии оболочки или Apache Ant . Есть проект Commons Launcher, который в основном позволяет вам указать ваш стартовый скрипт как файл сборки ant (если вы понимаете, что я имею в виду).
Затем вы можете указать что-то вроде:
В вашем файле запуска сборки, который запустит ваше приложение с правильным classpath.
источник
Если вы используете Java 6, то вы можете использовать подстановочные знаки в пути к классам.
Теперь можно использовать подстановочные знаки в определении пути к классам:
Ссылка: http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/
источник
Обратите внимание, что расширение подстановочных знаков не работает для Java 7 в Windows.
Проверьте эту проблему StackOverflow для получения дополнительной информации.
Обходной путь должен поставить точку с запятой сразу после подстановочного знака.
java -cp "somewhere/*;"
источник
Для предъявления по месту требования,
Я обнаружил это странное поведение в Windows под оболочкой MSYS / MinGW.
Работает:
Не работает:
Я совершенно уверен, что подстановочный знак не расширяется оболочкой, потому что, например,
(Пробовал тоже с другой программой, а не со встроенной
echo
, с тем же результатом.)Я полагаю, что это то,
javac
что пытается расширить его, и оно ведет себя по-разному, есть ли точка с запятой в аргументе или нет. Во-первых, он может пытаться расширить все аргументы, которые выглядят как пути. И только тогда он их проанализирует,-cp
взяв только следующий токен. (Обратите внимание, чтоcom.comsol.aco_1.0.0.jar
это второй JAR в этом каталоге.) Это все предположение.Это
источник
Все вышеперечисленные решения прекрасно работают, если вы разрабатываете и запускаете приложение 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 Error, бла-бла».
Я предполагаю, что вы находитесь в рабочем каталоге вашего исходного кода !!
Используйте следующий синтаксис для запуска из командной строки:
[Не пропустите. над]
Это потому, что вы поместили Main.java в пакет edu.sjsu.myapp, и java.exe будет искать точный шаблон.
Надеюсь, поможет !!
источник
Для окон кавычки обязательны и; следует использовать в качестве разделителя. например:
источник
Краткая форма: если ваш main находится внутри jar, вам, вероятно, потребуется дополнительный '-jar pathTo / yourJar / YourJarsName.jar', явно объявленный для его работы (даже если 'YourJarsName.jar' находился в пути к классам) (или , выраженный для ответа на первоначальный вопрос, который был задан 5 лет назад: вам не нужно явно повторно декларировать каждую банку, но, похоже, даже с java6 вам нужно переопределить вашу собственную банку ...)
Длинная форма: (Я сделал это явно до такой степени, что я надеюсь, что даже нарушители Java могут использовать это)
Как и многие здесь, я использую eclipse для экспорта jar-файлов: (File-> Export -> 'Runnable JAR File'). В предложении «Затмение библиотеки» (Juno) есть три варианта:
Обычно я бы использовал opt2 (а opt1 определенно ломался), однако нативный код в одном из используемых мной jar-файлов обнаружил разрывы с помощью удобного трюка «jarinjar», который затмевает, когда вы выбираете эту опцию. Даже после того, как я понял, что мне нужен opt3, а затем нашел эту запись в StackOverflow, мне все еще потребовалось некоторое время, чтобы понять, как запустить мой основной за пределами затмения, так что вот что сработало для меня, так как это полезно для других ...
Если вы назвали свой jar: "fooBarTheJarFile.jar" и все настроено на экспорт в каталог: "/ theFully / qualPath / toYourChosenDir".
(имеется в виду поле «Место назначения экспорта»: «/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar»)
После того, как вы нажмете финиш, вы обнаружите, что eclipse помещает все библиотеки в папку с именем 'fooBarTheJarFile_lib' в этом каталоге экспорта, давая вам что-то вроде
Затем вы можете запустить из любой точки вашей системы:
(Для новичков в Java: «package.path_to.the_class_with.your_main» - это объявленный путь к пакету, который вы найдете в верхней части файла «TheClassWithYourMain.java», который содержит «main (String [] args) {.. .} 'что вы хотите запустить из-за пределов Java)
Заметим ловушку: наличие fooBarTheJarFile.jar в списке jar-файлов на объявленном пути к классу недостаточно. Вы должны явно объявить '-jar' и повторно объявить местоположение этого jar.
например это ломает:
пересчитывается с относительными путями:
(с использованием версии Java "1.6.0_27"; через виртуальную машину OpenJDK 64-Bit Server в Ubuntu 12.04)
источник
Единственный способ, которым я знаю, как сделать это индивидуально, например:
Надеюсь, это поможет!
источник
for jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
класс от wepapp:
источник
Вам нужно добавить их все отдельно. В качестве альтернативы, если вам действительно нужно просто указать каталог, вы можете разархивировать все в один каталог и добавить его в свой путь к классам. Однако я не рекомендую этот подход, так как вы рискуете получить причудливые проблемы с версионированием и неуправляемостью.
источник
Не является прямым решением для возможности установить / * в -cp, но я надеюсь, что вы могли бы использовать следующий скрипт, чтобы немного облегчить ситуацию с динамическими путями классов и каталогами lib.
Сценарий для Linux, может быть аналогичным для Windows тоже. Если в качестве входных данных для "libDir2Scan4jars" указан правильный каталог; скрипт отсканирует все файлы jar, создаст строку classpath и экспортирует ее в переменную env "tmpCLASSPATH".
источник
macOS, текущая папка
Для Java 13 на MacOS Мохаве ...
Если все ваши
.jar
файлы находятся в одной папке, используйтеcd
эту папку в качестве текущего рабочего каталога . Подтвердите сpwd
.Для этого
-classpath
вы должны сначала перечислить файл JAR для вашего приложения. Используя символ двоеточия:
в качестве разделителя, добавьте звездочку,*
чтобы получить все другие файлы JAR в той же папке. Наконец, передайте полное имя пакета класса с вашимmain
методом .Например, для приложения в файле JAR, названном
my_app.jar
с помощьюmain
метода в классе, названномApp
в названном пакетеcom.example
, вместе с некоторыми необходимыми jar-файлами в той же папке:источник
Думайте о файле jar как о корне структуры каталогов. Да, вам нужно добавить их все по отдельности.
источник
Установите путь к классу так, чтобы он подходил для нескольких jar-файлов и файлов классов текущего каталога.
источник
У меня есть несколько банок в папке. Следующая команда сработала для меня,
JDK1.8
чтобы включить все банки, присутствующие в папке. Обратите внимание, что включить в кавычки, если у вас есть пробел в classpathWindows
Компиляция:
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
источник
Я пытаюсь запустить файл Java либо как jar, либо как классы в Ubuntu. Я потерпел неудачу в обоих вариантах. Следующим исключением является его вывод.
или
или
Я нашел ответ:
Моя глупость
Первый шаг: Вы должны установить соответствующую Java: у меня была Java 11, но я установил в качестве Java lib путь 8-й версии! - Вы можете установить версию Java здесь:
2-й шаг: затем выполните следующую команду, изменив путь и имена файлов на соответствующие пути и файлы:
Это было успешно выполнено!
источник