Запустіть файл JAR з командного рядка та вкажіть classpath


115

Я склав файл JAR і вказав головний клас у маніфесті (я використав функцію експорту Eclipse ). Мої залежності знаходяться в каталозі з написом lib. Я, здається, не можу отримати прямої відповіді про те, як виконати свій файл JAR, вказавши, що він повинен використовувати lib/*як classpath.

Я спробував:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main

тощо ...

Кожен дає помилку:

Error: Could not find or load main class ....

або дає NoClassDefFoundErrorвказівку, що бібліотеки не знайдені.

Я навіть спробував переробити файл JAR і включив libкаталог та вміст, але все-таки немає кісток ...

Як я можу виконати файл JAR з командного рядка та вказати класний шлях для використання?


Відповіді:


204

При вказівці -jarто -cpпараметр буде проігноровано.

З документації :

Використовуючи цю опцію, файл JAR є джерелом усіх класів користувачів, а інші налаштування шляху користувача ігноруються.

Ви також не можете "включити" потрібні файли jar в інший файл jar (вам потрібно буде витягнути їх вміст і помістити файли .class у ваш jar файл)

У вас є два варіанти:

  1. включити всі файли jar із libкаталогу в маніфест (ви можете використовувати там відносні шляхи)
  2. Вкажіть усе ( включаючи вашу jar) у командному рядку, використовуючи -cp:
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

22
; замість: якщо ви використовуєте Windows наступним чином java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
Помилка

Ви також не можете "включити" потрібні файли jar в інший файл jar. Звичайно, ти можеш. Якщо він призначений для внутрішнього використання (тобто ви очікуєте, що користувач має певні технічні навички тощо), ви можете просто попросити, що крок 1, перш ніж спробувати запустити банку, - це запустити unzip MyJar.jar lib/*.jar. Потім, як ви пропонуєте, вони можуть бігатиjava -cp MyJar.jar:lib/* ...
Роджер

3
Промінь полягає в тому, що це загальний випадок використання для запуску банку "u all inclusive" з посиланням на файл властивостей зовнішнього сервера. Очевидно, що це не блокатор, але, безумовно, менш багатослівна команда, якщо ви можете використовувати -jar і не потрібно вказувати головне
Ендрю Норман

Мені потрібно було трохи розібратися. І потрібно близько 6 рядків, щоб явно завантажити файл log4j. Ще одна помилка Java, яку ніколи не виправлять.
Tuntable

1
Зауважте, що маніфест Class-Path можна використовувати лише для завантаження файлів jar. Наприклад, його не можна використовувати для пошуку log4j3.xml. Зробив мене добре.
Tuntable

34

Запустіть файл jar та вкажіть шлях до класу таким чином:

java -cp <jar_name.jar:libs/*> com.test.App

jar_name.jar - це повне ім'я JAR, яке ви хочете виконати

libs/* це шлях до ваших JAR-груп для залежності

com.test.App- це повністю кваліфіковане ім'я класу з JAR, який має main(String[])метод

Банка та залежна банка повинні мати дозволи на виконання.


10

Ви можете зробити це в оболонці unix:

java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

Це можна зробити у вікні PowerShell:

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main

4

Крім того, використовуйте маніфест, щоб вказати шлях до класу та основний клас, якщо вам це подобається, тож вам не потрібно використовувати -cpабо вказувати основний клас. У вашому випадку він міститиме такі рядки:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

На жаль, вам потрібно прописати кожну банку в маніфесті (не biggie, як це робиться лише один раз, і ви можете використовувати скрипт для створення файлу або використовувати інструмент для збирання типу ANT або Maven або Gradle). І посилання має бути відносним або абсолютним каталогом до того, де ви запускаєте java -jar MyJar.jar.

Потім виконайте це за допомогою

java -jar MyJar.jar

Я думаю, що Class-Path повинен посилатися на файли у зовнішній банці. Я не міг змусити це працювати взагалі, посилатися на конфігураційні файли поза MyJar.jar.
Tuntable

0

Ви можете виконати команду Runtime.getRuntime.exec (команда), щоб перезапустити банку, включаючи classpath з arg.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.