Подтвердить что ты не робот

Различия между "java -cp" и "java -jar"?

В чем разница между запуском приложения Java с помощью java -cp CLASSPATH и java -jar JAR_FILE_PATH? Один из них предпочитает другой для запуска приложения Java? Я имею в виду, какой из этих способов дороже для JVM (в зависимости от использования их ресурсов)?

Какой из них вызовет JVM для создания новых потоков при попытке запустить приложение?

4b9b3361

Ответ 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, он все равно проверит файл манифеста. Таким образом, вы можете определить некоторые из классов-классов в манифесте, а некоторые в командной строке. Это особенно полезно, если у вас есть зависимость от какой-либо сторонней банки, которую вы не можете предоставить своей сборке или не хотите предоставлять (ожидая, что она будет найдена уже в системе, где она будет установлена, например). Поэтому вы можете использовать его для обеспечения внешних банок. Он может различаться между системами или может даже иметь другую версию в другой системе (но с теми же интерфейсами). Таким образом, вы можете создать приложение с другой версией и добавить фактическую стороннюю зависимость к пути класса в командной строке при ее запуске в разных системах.