Java, используя "-cp" и "-jar" вместе

Folks,

Ранее у меня был только один файл jar, и манифест был настроен так, чтобы я мог просто запустить свою программу как:

 java -jar MyApp.jar

Теперь я разделил свою функциональность на два файла jar - MyCore.jar и MyApp.jar.

Следующая команда работает:

java -cp "*" com.mycompany.mypackage.App

Но я не могу заставить работать следующее

java -cp "*" -jar MyApp.jar

Я получаю ClassNotFoundException.

Я предпочитаю использовать переключатель "-jar". Есть ли способ заставить его работать?

Спасибо заранее за вашу помощь.

С Уважением,
Питер

4 ответа

Решение

У меня есть файл Manifest.mf, как это.

Manifest-Version: 1.0
Main-Class: com.mycompany.mypackage.App
Class-Path: MyApp.jar MyCore.jar log4j.jar 

Вы можете просто добавить любые jar-файлы, которые вам нужны, в строку Class-Path. Затем, пока банки находятся в пути к классам, вы можете запустить команду java -jar без -cp.

В соответствии с документацией Java Cli вы не можете объединить -cp и -jar в одной команде

-jar Запустить программу, инкапсулированную в архиве JAR. Первым аргументом является имя файла JAR вместо имени класса запуска. Чтобы эта опция работала, манифест файла JAR должен содержать строку вида Main-Class:classname. Здесь classname идентифицирует класс, имеющий открытый статический метод void main(String[] args), который служит отправной точкой вашего приложения. Обратитесь к справочной странице инструмента Jar и следу Jar Учебного руководства по Java для получения информации о работе с файлами Jar и манифестами файла Jar. Когда вы используете эту опцию, файл JAR является источником всех пользовательских классов, а другие параметры пути к классам пользователей игнорируются. Обратите внимание, что для файлов JAR, которые можно запускать с опцией "java -jar", могут быть установлены разрешения на выполнение, поэтому они могут запускаться без использования "java -jar". См. Архивные файлы Java (JAR).

Чтобы решить эту проблему, вам необходимо убедиться, что манифест в вашем jar-приложении ссылается как на класс, содержащий основной файл, так и на путь к классам.

Предполагая, что оба файла JAR находятся в одной папке и com.mycompany.mypackage.App является основным классом приложения, попробуйте эту команду:

java -cp MyCore.jar;MyApp.jar com.mycompany.mypackage.App

Это должно работать для вас.

Если вы настаиваете на использовании -jar переключиться (почему?), тогда вам нужно изменить файл манифеста, чтобы добавить Class-Path ключ и укажите путь ко всем связанным JAR-файлам. Это делает ваше приложение менее гибким в случае, если файлы jar не упакованы с файлом jar основного приложения.

Добавьте манифест, который оба определяет класс, содержащий main() а также путь к классу. См. Работа с файлами манифеста: Добавление классов в путь к классам JAR-файла для получения дополнительной информации.

Тогда все приложение. может быть запущен с помощью -jarбез необходимости -cp,

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