Запустите файл 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)
У вас есть два варианта:
- включить все файлы JAR из
lib
каталог в манифест (вы можете использовать относительные пути там) - Укажите все (включая ваш 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.