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


1019

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

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


3
Извините, я никогда не принимал это. Это должно быть сообщество вики. Никогда не использовал один из предоставленных ответов. Я полагаю, что создал сценарий оболочки, который просто сканировал каталог lib / и создал путь к классам путем анализа имен файлов.
Крис Серра

В этой новой функции Java есть какая-то ошибка, потому что она не работает, как описано. Я сдался и использовал Ant, чтобы обойти это, как описано в одном из ответов.
Алекс Р


1
Существует проблема с обработкой подстановочных знаков в Windows. stackoverflow.com/questions/11607873/…
Михаил Адамович

6
Краткий ответ: (1) отбросить .jarдеталь, (2) должно быть как минимум 2 части, разделенные ;на Windows (как правило, в :другом месте). Например:java -classpath ".;lib/*" Program
Евгений Сергеев

Ответы:


1160

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

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

Windows

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

Юникс

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

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

java -cp $(echo lib/*.jar | tr ' ' ':')

(Обратите внимание, что использование пути к классам несовместимо с этой -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


2
Эта функция плохо документирована и, по-видимому, требует выполнения некоторых менее очевидных предварительных условий, чтобы работать по назначению.
Алекс Р

1
+1 за последний трюк bash / tr. Java / JamVM здесь не любит подстановочные знаки для путей за пределами рабочего каталога, но явная ссылка на каждый JAR с использованием подстановочного знака оболочки + trработает!
Supr

1
У меня есть команда java -classpath /jars/*:/anotherJarsDir/* com.test.MyClassбез кавычек, и она отлично работает. Мне интересно, почему оболочка не расширяет и не выдает ошибку?
Йеллавон

3
Также не используйте ~в -cp
Sohail Si

1
Ваш пример windows не работает с java 8 или более ранней версией, но с этим classpath: Test.jar; lib \ * ... прямая косая черта в порядке, за исключением случаев, когда перед звездочкой и несколькими другими ... смотрите bugs.openjdk. java.net/browse/JDK-8131329
philwalk

226

Под окнами это работает:

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

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


17
Идеальный ответ. 2 важные вещи, на которые следует обратить внимание: 1) Используйте кавычки и 2) Используйте только *, а не * .jar
Вим Deblauwe

4
Год и 8 месяцев спустя внесенные мной изменения в версию UNIX снова спасли меня. :) Забавно, как он не распознает мои фляги, *.jarно только с помощью *.
jmort253

Я обнаружил, что порядок путей к классам важен (но я не знаю почему). Я получал ошибки, пока не переключил порядок путей к классам.
user13107

@ jmort253, дело в том, что это не расширение * оболочки, но подстановочный знак - это java-разбор пути к классу, просмотр * и заполнение подстановочного знака
Себастьян

1
@SebastianGodelet - Да, это только то, что я путаюсь с подстановочными знаками Regex и этим обозначением, которое, я думаю, не то же самое. В основном то, что спасло меня, это знание разницы между :одной платформой и ;другой. :) Я компилирую Java из командной строки примерно раз в год, достаточно, чтобы не вспоминать, как часто, достаточно часто, чтобы раздражать.
jmort253

67

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

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

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

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


Похоже, это работает для многих людей, однако Java явно игнорирует записи Class-Path в файле манифеста. Мы не можем запустить приложение, не добавив вручную lib / * в путь к классам, используя -cp. Любые идеи?
Раку

6
ответ oxbow_lakes не совсем правильный; вещь Class-Path будет принята (и ТОЛЬКО это будет выполнено; -cp / -classpath игнорируется!), если вы запустите этот jar с помощью java -jar myapp.jar Я полагаю, что oxbow_lakes хотел написать это, когда он написал «java -classpath myapp.jar».
rzwitserloot

47

Мое решение на Ubuntu 10.04 с использованием java-sun 1.6.0_24, содержащее все jar-файлы в каталоге "lib":

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

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

java -cp $ (для i в lib / *. jar; сделать эхо -n $ i:; сделано). my.main.Class

4
забавная записка. java -cp lib / * my.main.Class всегда будет терпеть неудачу, потому что расширение glob оболочки lib / *, в то время как java -cp.: lib / * my.main.Class не будет, потому что.: lib / * не является допустимым glob дорожка. Потратьте некоторое время, чтобы отметить это
albfan

1
Это не работает; Linux расширит . Вы можете попробовать: java -cp '.: lib / ', и это прекрасно работает (обратите внимание на одинарные кавычки! Это не будет работать с двойными кавычками!). На самом деле,.: Lib / * может сработать, если это недопустимый глобус из-за двоеточия, но это немного ненадежно. Я бы добавил цитаты. Одиночные кавычки говорят bash не трогать какую-либо часть содержимого.
rzwitserloot

Не имеет значения (в этом контексте), используете ли вы одинарные или двойные кавычки. Вы хотите, чтобы оболочка не расширила (не закрыла) *, вот и все. И передайте текст "lib / *" буквально в JVM, чтобы виртуальная машина распознала его как "особый шаблон" и самостоятельно проверила файлы jar.
Angel O'Sphere

36

Короткий ответ: 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 , я решил расширить его.


моя проблема была с lib / *. jar, а не с lib / *. Большое спасибо это исправило. Я заметил, что есть разница между: и; но это могло бы быть моим испытанием-много-изменений-в-то же время.
Эйад Эбрахим

Спасибо за то, что подчеркиваете разницу между * и * .jar
бурахан алкан

36

Windows :

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

Linux :

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

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


Пример Windows не работает для Java 8 и более ранних версий
philwalk

Может быть, не работает для открытого JDK, я проверю это, и я буду говорить здесь
Wender

Извините, я провел тестирование с HotSpot и подумал, что это работает с openjdk.
Вендер

Для Oracle Java под Windows требуется обратная косая черта перед звездочкой, а не прямая косая черта, хотя я не перепроверял самые последние или альтернативные версии Java.
Philwalk

не работает на макросах
Greyshack


29

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

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


3
Это работает, но следить, пройти -Djava.ext.dirs=ДО-jar
Джованни Фуншал

5
java.ext.dirs будет сильно отличаться от обычного jar в classpath. Он имеет более высокий приоритет и разрешение, которое может каким-то образом переопределять классы в начальной загрузке (rt.jar)
Деннис C

Спасибо. На java-версии "1.8.0_221" Java (TM) SE Runtime Environment (сборка 1.8.0_221-b27) Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 25.221-b27, смешанный режим) ", только эта версия -D прохождения в классе работал. Традиционной формы нет.
Мэтт Кэмпбелл

23

Исправить :

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

9

Если вам действительно нужно указать все файлы .jar динамически, вы можете использовать сценарии оболочки или Apache Ant . Есть проект 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.


9

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


8

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

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

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


6

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

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

5

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

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

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

  1. javac -cp ".; json.jar" Main.java

  2. java -cp ".; json.jar" edu.sjsu.myapp.Main

    [Не пропустите. над]

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

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


4

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

java -cp "target\\*;target\\dependency\\*" my.package.Main

4

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


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

Как и многие здесь, я использую eclipse для экспорта jar-файлов: (File-> Export -> 'Runnable JAR File'). В предложении «Затмение библиотеки» (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», который затмевает, когда вы выбираете эту опцию. Даже после того, как я понял, что мне нужен opt3, а затем нашел эту запись в StackOverflow, мне все еще потребовалось некоторое время, чтобы понять, как запустить мой основной за пределами затмения, так что вот что сработало для меня, так как это полезно для других ...


Если вы назвали свой jar: "fooBarTheJarFile.jar" и все настроено на экспорт в каталог: "/ theFully / qualPath / 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"; через виртуальную машину OpenJDK 64-Bit Server в Ubuntu 12.04)


3

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

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

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


Возможно, это был единственный путь назад в 2008 году, но не больше.
simo.3792

Это не самое страшное. Это взлом, но у меня есть этот набор в моем bashrcfor jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
Devon Peticolas

3

класс от 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

2

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


3
Возможно, это был единственный путь назад в 2008 году, но не больше.
simo.3792

2

Не является прямым решением для возможности установить / * в -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, создаст строку classpath и экспортирует ее в переменную env "tmpCLASSPATH".


2

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

Для Java 13 на MacOS Мохаве ...

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

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

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

java -classpath my_app.jar:* com.example.App

не работает для Java 8
Greyshack

1

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


1

Установите путь к классу так, чтобы он подходил для нескольких 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

0

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

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


-1

Я пытаюсь запустить файл Java либо как jar, либо как классы в Ubuntu. Я потерпел неудачу в обоих вариантах. Следующим исключением является его вывод.

Download link: https://upload.cat/f694139f88c663b1

java org.statmetrics.Statmetric

или

java -cp /home/elias/statmetrics/statmetrics.jar :. org.statmetrics.Statmetrics

или

java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmeics/statmetrics.jar org.statmetrics.Statmetrics

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/adapters/XmlAdapter
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at org.statmetrics.c.a(Unknown Source)
    at org.statmetrics.dw.a(Unknown Source)
    at org.statmetrics.dx.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.adapters.XmlAdapter
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 12 more

Я нашел ответ:

Моя глупость

Первый шаг: Вы должны установить соответствующую Java: у меня была Java 11, но я установил в качестве Java lib путь 8-й версии! - Вы можете установить версию Java здесь:

  sudo update-alternatives --config java

2-й шаг: затем выполните следующую команду, изменив путь и имена файлов на соответствующие пути и файлы:

  java -classpath "/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/*" -jar /home/elias/statmetrics/statmetrics.jar org.statmetrics.Statmetrics

Это было успешно выполнено!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.