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

Я скомпилировал файл JAR и указал Main-Class в манифесте (я использовал функцию экспорта Eclipse). Мои зависимости находятся в каталоге с меткой 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 из командной строки и указать путь к классу для использования?

4 ответа

Решение

Когда вы указываете -jar тогда -cp Параметр будет игнорироваться.

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

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

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

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

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

Запустите файл JAR и укажите путь к классу, например:

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

jar_name.jar полное имя JAR, который вы хотите выполнить

libs/* путь к JAR-файлам вашей зависимости

com.test.App это полное имя класса из JAR, который имеет main(String[]) метод

Баночка и зависимая банка должны иметь права на выполнение.

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

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

Вы можете сделать это в Windows PowerShell:

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

В качестве альтернативы, используйте манифест, чтобы указать class-path и main-class, если хотите, поэтому вам не нужно использовать -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

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

Другие вопросы по тегам