Различия между "java -cp" и "java -jar"?
В чем разница между запуском приложения Java с помощью java -cp CLASSPATH
и java -jar JAR_FILE_PATH
? Один из них предпочитает другой для запуска приложения Java? Я имею в виду, какой из этих способов дороже для JVM (в зависимости от использования их ресурсов)?
Какой из них вызовет JVM для создания новых потоков при попытке запустить приложение?
Ответы
Ответ 1
Я предпочитаю, чтобы первая версия запускала Java-приложение только потому, что у него меньше ловушек ( "добро пожаловать в адский путь к классу" ). Второй требует исполняемого файла jar, и путь класса для этого приложения должен быть определен внутри манифеста jar (все остальные объявления classpath будут игнорироваться молча). Итак, со второй версией вам нужно будет заглянуть в банку, прочитать манифест и попытаться выяснить, действительны ли элементы classpath, из которых хранится jar... Это можно избежать.
Я не ожидаю каких-либо преимуществ или недостатков производительности для любой версии. Это просто говорит jvm, какой класс использовать для основного потока и где он может найти библиотеки.
Ответ 2
С аргументом -cp
вы предоставляете пути пути к пути к другим классам или библиотекам, которые могут потребоваться вашей программе при компиляции или запуске. С помощью -jar
вы указываете исполняемый JAR файл, который вы хотите запустить.
Вы не можете указать их оба. Если вы попытаетесь запустить java -cp folder/myexternallibrary.jar -jar myprogram.jar
, то это не будет работать. Путь к классам для этого JAR должен быть указан в его манифесте, а не как аргумент -cp
.
Подробнее об этом здесь и здесь.
PS: -cp
и -classpath
являются синонимами.
Ответ 3
java -cp CLASSPATH необходимо, если вы хотите указать весь код в пути к классам. Это полезно для отладки кода.
Яркий исполняемый формат: java -jar JarFile
можно использовать, если вы хотите запустить приложение с помощью одной короткой команды. Вы можете указать дополнительные зависимые файлы jar в вашем МАНИФЕСТЕ, используя пробельные разделители в записи Class-Path, например:
Class-Path: mysql.jar infobus.jar acme/beans.jar
Оба сравнимы с точки зрения производительности.
Ответ 4
При использовании java -cp
вам необходимо предоставить полное имя основного класса, например
java -cp com.mycompany.MyMain
При использовании java -jar myjar.jar
ваш файл jar должен предоставить информацию о главном классе через manifest.mf, содержащуюся в файле jar в папке META-INF
:
Main-Class: com.mycompany.MyMain
Ответ 5
В плане производительности не будет никакой разницы.
Используя java-cp, мы можем указать необходимые классы и jar в пути к классам для запуска файла класса java.
Если это исполняемый файл jar. Когда используется java -jar-команда, jvm находит класс, который должен запускаться из файла /META -INF/MANIFEST.MF внутри файла jar.
Ответ 6
Как уже было сказано, -cp предназначен только для указания jvm в командной строке, какой класс использовать для основного потока и где он может найти библиотеки (define classpath). В -jar он ожидает, что класс-путь и основной класс будут определены в манифесте jar файла. Таким образом, другое - для определения вещей в командной строке, в то время как другие обнаруживают их внутри манифеста jar. Нет никакой разницы в производительности. Вы не можете использовать их одновременно, -jar переопределит -cp.
Хотя даже если вы используете -cp, он все равно проверит файл манифеста. Таким образом, вы можете определить некоторые из классов-классов в манифесте, а некоторые в командной строке. Это особенно полезно, если у вас есть зависимость от какой-либо сторонней банки, которую вы не можете предоставить своей сборке или не хотите предоставлять (ожидая, что она будет найдена уже в системе, где она будет установлена, например). Поэтому вы можете использовать его для обеспечения внешних банок. Он может различаться между системами или может даже иметь другую версию в другой системе (но с теми же интерфейсами). Таким образом, вы можете создать приложение с другой версией и добавить фактическую стороннюю зависимость к пути класса в командной строке при ее запуске в разных системах.