Вопрос-ответ

Run a JAR file from the command line and specify classpath

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

Я скомпилировал 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 из командной строки и указать путь к классу для использования?

Переведено автоматически
Ответ 1

Когда вы укажете, -jar тогда -cp параметр будет проигнорирован.

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


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


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

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


  1. включите все файлы jar из lib каталога в манифест (вы можете использовать относительные пути там)

  2. Укажите все (включая ваш jar) в командной строке с помощью -cp:

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

Ответ 2

Запустите jar-файл и укажите путь к классу следующим образом:

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

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

libs/* это путь к вашим JARS зависимостей

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

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

Ответ 3

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

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

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

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main
Ответ 4

В качестве альтернативы, используйте манифест, чтобы указать class-path и main-class, если хотите, поэтому вам не нужно использовать -cp или указывать main class . В вашем случае он будет содержать строки, подобные этой:

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

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

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

java -jar MyJar.jar
2023-10-13 11:57 java