В чем разница между запуском Java-приложения с помощью java -cp CLASSPATH
и java -jar JAR_FILE_PATH
? Один из них предпочтительнее другого для запуска приложения Java? Я имею в виду, какой из этих способов дороже для JVM (в зависимости от использования их машинных ресурсов)?
Какой из них приведет к тому, что JVM будет создавать больше потоков при попытке запустить приложение?
С
-cp
аргументом вы указываете путь к классам, то есть пути к дополнительным классам или библиотекам, которые могут потребоваться вашей программе при компиляции или запуске. С помощью-jar
вы указываете исполняемый файл JAR, который хотите запустить.Вы не можете указать их обоих. Если вы попытаетесь бежать,
java -cp folder/myexternallibrary.jar -jar myprogram.jar
это не сработает. Путь к классам для этого JAR должен быть указан в его манифесте, а не в качестве-cp
аргумента.Вы можете найти больше об этом здесь и здесь .
PS:
-cp
и-classpath
являются синонимами.источник
-cp
и-classpath
, то нет, разницы нет.-jar
вы указываете, какой исполняемый файл JAR вы хотите запустить. Здесь-cp
вы указываете пути к дополнительным классам / библиотеке, которые могут потребоваться вашей программе. У двух очень разные цели.java -jar PATH -cp PATH2
При использовании
java -cp
вам необходимо указать полное имя основного класса, напримерjava -cp com.mycompany.MyMain
При использовании
java -jar myjar.jar
файла jar необходимо предоставить информацию об основном классе через manifest.mf, содержащийся в файле jar в папкеMETA-INF
:Main-Class: com.mycompany.MyMain
источник
java -cp CLASSPATH необходим, если вы хотите указать весь код в пути к классам. Это полезно для отладки кода.
Формат исполняемого файла jarred:
java -jar JarFile
можно использовать, если вы хотите запустить приложение с помощью одной короткой команды. Вы можете указать дополнительные зависимые файлы jar в своем МАНИФЕСТЕ, используя jar-файлы, разделенные пробелами, в записи Class-Path, например:Оба сопоставимы по производительности.
источник
Как уже было сказано, -cp предназначен только для указания jvm в командной строке, какой класс использовать для основного потока и где он может найти библиотеки (определить путь к классам). В -jar он ожидает, что путь к классу и основной класс будут определены в манифесте файла jar. Таким образом, другое предназначено для определения вещей в командной строке, в то время как другие находят их внутри манифеста jar. Нет разницы в производительности. Вы не можете использовать их одновременно, -jar переопределит -cp.
Хотя даже если вы используете -cp, он все равно проверит файл манифеста. Таким образом, вы можете определить некоторые пути к классам в манифесте, а некоторые - в командной строке. Это особенно полезно, когда у вас есть зависимость от стороннего jar-файла, который вы можете не предоставлять вместе со своей сборкой или не хотите предоставлять (например, ожидая, что он уже найден в системе, где он будет установлен). Таким образом, вы можете использовать его для создания внешних банок. Его местоположение может отличаться в зависимости от системы, или он может даже иметь другую версию в другой системе (но с одинаковыми интерфейсами). Таким образом, вы можете создать приложение с другой версией и добавить фактическую зависимость стороннего производителя к class-path в командной строке при его запуске в разных системах.
источник
По производительности разницы не будет. Используя java-cp, мы можем указать необходимые классы и jar-файлы в пути к классам для запуска файла класса java.
Если это исполняемый файл jar. Когда используется команда java -jar, jvm находит класс, который необходимо запустить, из файла /META-INF/MANIFEST.MF внутри файла jar.
источник