Запустите файл JAR из командной строки и укажите путь к классам

115

Я скомпилировал файл JAR и указал главный класс в манифесте (я использовал функцию Eclipse Export ). Все мои зависимости находятся в каталоге с меткой lib. Кажется, я не могу получить прямого ответа о том, как выполнить мой файл JAR, указав, что он должен использовать в lib/*качестве пути к классам.

Я пробовал:

]$ 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 из командной строки и указать путь к классам, который нужно использовать?

SnakeDoc
источник

Ответы:

204

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

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

Когда вы используете эту опцию, JAR-файл является источником всех пользовательских классов, а другие настройки пути к пользовательскому классу игнорируются.

Вы также не можете «включить» необходимые файлы jar в другой файл jar (вам нужно будет извлечь их содержимое и поместить файлы .class в свой файл jar)

У вас есть два варианта:

  1. включить все файлы jar из libкаталога в манифест (вы можете использовать там относительные пути)
  2. Укажите все ( включая вашу банку) в командной строке, используя -cp:
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main
a_horse_with_no_name
источник
22
; вместо: если вы используете окна следующим образом: java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
Ошибка
Вы также не можете «включить» необходимые файлы jar в другой файл jar. Что вы можете. Если он предназначен для внутреннего использования (т. Е. Вы ожидаете, что у пользователя будут какие-то технические навыки и т. Д.), Вы можете просто попросить выполнить шаг 1, прежде чем пытаться запустить jar unzip MyJar.jar lib/*.jar. Тогда, как вы предлагаете, они могут бежатьjava -cp MyJar.jar:lib/* ...
Роджер
3
облом заключается в том, что это распространенный вариант использования для запуска «все включено» uber jar со ссылкой на внешний файл свойств для конкретного сервера. Очевидно, не блокировщик, но, безусловно, менее подробная команда, если бы вы могли использовать -jar и не указывать основную
Эндрю Норман
Мне потребовалось время, чтобы понять. И требуется около 6 строк для явной загрузки файла log4j. Еще одна ошибка Java, которую никогда не исправить.
Tuntable
1
Обратите внимание, что путь к классу манифеста может использоваться только для загрузки файлов 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[])метод

Jar и зависимый jar должны иметь разрешения на выполнение.

Sid
источник
10

Вы можете сделать это в оболочке unix:

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

Вы можете сделать это в Windows 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

К сожалению, вам нужно указать каждую банку в манифесте (не так уж важно, как вы делаете только один раз, и вы можете использовать скрипт для создания файла или использовать инструмент сборки, такой как ANT, Maven или Gradle). И ссылка должна быть относительной или абсолютной директорией, в которой вы запускаете java -jar MyJar.jar.

Затем выполните его с помощью

java -jar MyJar.jar
HankCa
источник
Я думаю, что Class-Path должен ссылаться на файлы во внешней банке. Я не мог заставить это работать в целом, чтобы ссылаться на файлы конфигурации вне MyJar.jar.
Tuntable
0

Вы можете выполнить Runtime.getRuntime.exec (команду), чтобы перезапустить jar, включая путь к классам с args.

Тим де Врис
источник