Включаючи всі банки в каталог в межах Java classpath


1018

Чи є спосіб включити всі файли jar в каталог у класний шлях?

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


3
Вибачте, я ніколи цього не приймав. Це має бути вікі спільноти. Ніколи не використовував жодної із наданих відповідей. Я вважаю, що я створив скрипт оболонки, який щойно просканував lib / каталог і створив classpath з розбору імен файлів.
Кріс Серра

У цій новій функції Java є якась помилка, оскільки вона не працює як описано. Я відмовився від використання Мурахи, щоб обійти його, як описано в одній з відповідей.
Alex R


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

6
Коротка відповідь: (1) скинути .jarдеталь, (2) повинна мати принаймні 2 частини, розділені знаком a ;в Windows (що зазвичай в :іншому місці). Наприклад:java -classpath ".;lib/*" Program
Євгеній Сергєєв

Відповіді:


1159

Використовуючи 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 $(echo lib/*.jar | tr ' ' ':')

(Зверніть увагу, що використання classpath не сумісне з -jarопцією. Дивіться також: Виконати jar файл з кількома бібліотеками classpath з командного рядка )

Розуміння Wildcards

З документа 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
Ця функція погано задокументована і, здається, вимагає виконання деяких менш очевидних передумов, щоб працювати за призначенням.
Alex R

1
+1 за останній трюк "баш / тр" Java / JamVM тут не любить підстановку для шляхів поза робочим каталогом, але явно посилається на кожен JAR за допомогою підстановки оболонки + trпрацює!
Супр

1
У мене команда java -classpath /jars/*:/anotherJarsDir/* com.test.MyClassбез жодних лапок, і вона працює чудово. Мені цікаво, чому оболонка не розширює її і помиляється?
yellavon

3
Також не використовуйте ~в -cp
Sohail Si

1
Ваш приклад Windows не працює з java 8 або більш ранньою версією, але це було б з таким класним шляхом: 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, тож * wildcard слід використовувати окремо .


У Linux працює наступне:

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

Роздільники є двокрапками замість крапки з комою.


17
Ідеальна відповідь. 2 важливі речі, які слід помітити: 1) Використовуйте цитати та 2) Використовуйте лише *, а не * .jar
Вім Деблауве

4
Через рік і 8 місяців пізніше мене змінили зміни, внесені до версії UNIX. :) Смішно, як би він не розпізнавав мої файли jar, *.jarа лише з *.
jmort253

Я виявив, що порядок занять курсами важливий (але я не знаю чому). Я отримував помилки, поки не змінив порядок класових шляхів.
користувач13107

@ Jmort253, справа в тому, що це не оболонка * розширюється, але підстановлювальний є Java розборі шляху до класів, бачачи * і заповнення шаблона
Себастьян

1
@SebastianGodelet - Так, це просто я плутаюсь між шаблонами Regex і цим позначенням, яке я не думаю. Переважно, що мене врятувало - це знати різницю між :однією платформою та ;на іншій. :) Я компілюю з Java з командного рядка приблизно раз на рік, достатньо, щоб не пам’ятати, як все-таки досить часто дратувати.
jmort253

67

Ми вирішуємо цю проблему, розгортаючи головний jar файл, myapp.jarякий містить файл manifest ( Manifest.mf) із зазначенням classpath з іншими необхідними банками, які потім розгортаються поруч. У цьому випадку вам потрібно заявити 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

Примітка: це незалежно від платформи - ми можемо використовувати ті самі банки для запуску на сервері UNIX або на ПК з Windows.


Це, здається, працює для багатьох людей, однак, здається, Java явно ігнорує записи Class-Path у файлі маніфесту. Ми не можемо запустити додаток, не додавши вручну "lib / *" на класний шлях за допомогою -cp. Будь-які ідеї?
Раку

6
відповідь oxbow_lakes не зовсім правильна; річ Class-Path вшановується (і ТІЛЬКИ це шанується; -cp / -classpath ігнорується!), якщо ви запускаєте цю банку з java -jar myapp.jar. Я припускаю, що oxbow_lakes мав намір написати це, коли він написав "java -classpath myapp.jar".
rzwitserloot

47

Моє рішення на Ubuntu 10.04, використовуючи java-sun 1.6.0_24 з усіма банками в каталозі "lib":

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

Якщо це не вдасться, слід виконати наступну команду (виводить усі * .jars у каталог lib до парам classpath)

java -cp $ (для i in lib / *. jar; do echo -n $ i:; done). my.main.Class

4
кумедна записка. java -cp lib / * my.main.Class вийде з ладу завжди, оскільки розширення глобальної оболонки lib / *, тоді як java -cp .: lib / * my.main.Class не буде. шлях. Візьміть деякий час , щоб відзначити , що
albfan

1
Це не працює; Linux розширить . ви можете спробувати: java -cp '.: lib / ', і це добре працює (зверніть увагу на одиничні лапки! Це не працюватиме з подвійними лапками!). Насправді.: Lib / * може спрацювати, якщо це не законний глобул через товстої кишки, але він відчуває себе трохи іффі. Я б додав цитати. Одиночні цитати наказують баш не торкатися жодної частини вмісту.
rzwitserloot

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

36

Коротка відповідь: java -classpath lib/*:. my.package.Program

Oracle надає документацію щодо використання макіяжів на класових шляхах, тут для Java 6 та тут для Java 7 , під заголовком розділу Розуміння підстановок для класу . (Коли я це пишу, дві сторінки містять однакову інформацію.) Ось короткий зміст основних моментів:

  • Загалом, щоб включити всі JAR-адреси в заданий каталог, ви можете використовувати підстановку *( не *.jar ).

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

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

  • Підстановка не буде шукати JAR в підкаталогах.

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

Так, моє перше посилання - це те саме, що вказано у відповіді на найкращу оцінку (яку я не сподіваюсь обігнати), але ця відповідь не дає великого пояснення поза посиланням. Оскільки такого роду поведінка НЕ рекомендується на переповнення стека в ці дні , я думав , що розширити на ньому.


моя проблема була з lib / *. jar, а не lib / *. Велике спасибі це виправило. Я помітив, що є різниця між: і; але це може бути моє тестування - багато змін - одночасно.
Еяд Ебрагім

Дякую за наголос на різниці між * та * .jar
burakhan alkan

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 і новіших
версій

Можливо, це не працює для відкритого JDK, я перевірю це, і я поговорю тут
Wender

Вибачте, я зробив тест з HotSpot, і я вважав, що це працює з openjdk.
Вендер

Oracle java під Windows вимагає зворотної косої риски перед зірочкою, а не передньої косою рисою, хоча я не перевіряв останню або альтернативну версію Java.
фольклор

не працює на macos
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 буде дуже відрізнятися від звичайної банки в класі. Він має більш високий пріоритет і дозвіл, який зможе якось перекрити класи у завантажувальній марці (rt.jar)
Dennis C

Дякую. У версії "java" 1.8.0_221 "Java (TM) SE Runtime Environment (збірка 1.8.0_221-b27) 64-бітний сервер VM сервера Java HotSpot (TM) (збірка 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, який в основному дозволяє вам вказати свій сценарій запуску як файл збірки мурашок (якщо ви бачите, що я маю на увазі).

Потім ви можете вказати щось на зразок:

<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, то ви можете використовувати символи підкреслення на класі.

Тепер можна використовувати символи підстановки у визначенні classpath:

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 blah blah".

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

Використовуйте такий синтаксис, щоб запустити його з командного рядка:

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

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

    [Не пропустіть. вище]

Це тому, що ви розмістили Main.java всередині пакета edu.sjsu.myapp і java.exe буде шукати точну схему.

Сподіваюся, це допомагає !!


4

Для Windows необхідні цитати та; слід використовувати як роздільник. наприклад:

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

4

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


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

Як і багато хто тут, я використовую eclipse для експортування банок: (Файл-> Експорт -> 'Виконаний файл JAR'). Існує три варіанти пропозицій затемнення "Поводження з бібліотекою" (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 напевно був зламаним), однак нативний код в одній з банок, які я використовую, я виявив перерви зі зручним трюком "jarinjar", який затемнення використовує, коли ви виберете цей варіант. Навіть після того, як я зрозумів, що мені потрібен opt3, а потім знайшовши цей запис StackOverflow, мені все ж знадобився певний час, щоб зрозуміти, як запустити головну поза поза затемнення, тож ось що для мене спрацювало, як це корисно для інших ...


Якщо ви назвали ваш jar: "fooBarTheJarFile.jar", і все встановлено для експорту в dir: "/ theFully / кваліфікований шлях / toYourChosenDir".

(тобто поле "Експорт пункту призначення" буде читати: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')

Після того, як ви закінчите, ви знайдете затемнення, а потім поміщає всі бібліотеки у папку з назвою '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.

наприклад, це перерви:

 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-бітний сервер VM для OpenJDK на ubuntu 12.04)


3

Єдиний спосіб, як я знаю, як це зробити індивідуально, наприклад:

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

Сподіваюся, що це допомагає!


Це, можливо, був єдиний шлях ще у08 році, але вже не.
simo.3792

Це не найгірше. Це хак, але я маю цей набір у моїй башерціfor jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
Девон Петіколас

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

Додавати їх потрібно все окремо. Крім того, якщо вам дійсно потрібно просто вказати каталог, ви можете зв'язати все в один dir і додати це до свого класного шляху. Я не рекомендую такий підхід, оскільки ви ризикуєте химерними проблемами у версії та непридатності до класів.


3
Це, можливо, був єдиний шлях ще у08 році, але вже не.
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"; скрипт сканує всі банки та створить рядок classpath та експортує його до змінної env "tmpCLASSPATH".


2

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

не працює для Java 8
Greyshack


1

Встановіть класний шлях таким чином, щоб підходили кілька банок та файли класів поточного каталогу.

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щоб включати всі присутні банки в папку. Зверніть увагу, щоб включити до лапок, якщо у вас є пробіл у класі

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 восьму версію! - Ви можете встановити версію Java звідси:

  sudo update-alternatives --config java

Другий крок: Потім запустіть таку команду, змінивши назви шляху та файлів на відповідний шлях та файли:

  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.