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



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



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

674   6  

6 ответов:

Я предпочитаю первую версию для запуска приложения java только потому, что она имеет меньше подводных камней ("добро пожаловать в classpath hell"). Для второго требуется исполняемый файл jar, и путь к классу для этого приложения должен быть определен внутри манифеста jar (все остальные объявления classpath будут молча игнорироваться...). Поэтому со второй версией вам нужно будет заглянуть в jar, прочитать манифест и попытаться выяснить, действительны ли записи classpath из того места, где хранится jar... Это устранимый.

Я не ожидаю каких-либо преимуществ или недостатков производительности для любой версии. Это просто говорит jvm, какой класс использовать для основного потока и где он может найти библиотеки.

С -cp аргумент вы предоставляете classpath т. е. путь(ы) к дополнительным классам или библиотекам, которые могут потребоваться вашей программе при компиляции или запуске. С -jar вы указываете исполняемый файл JAR, который вы хотите запустить.

вы не можете указать их обоих. Если вы попытаетесь запустить java -cp folder/myexternallibrary.jar -jar myprogram.jar тогда это не будет действительно работать. Путь к классу для этого JAR должен быть указан в его манифесте, а не как

при использовании java -cp вы должны предоставить полное имя основного класса, например

java -cp com.mycompany.MyMain

при использовании java -jar myjar.jar ваш файл jar должен предоставлять информацию о главном классе через манифест.mf содержится в файле jar в папке META-INF:

Main-Class: com.mycompany.MyMain

java-CP CLASSPATH необходим, если вы хотите указать весь код в classpath. Это полезно для отладки кода.

jarred исполняемый формат:java -jar JarFile можно использовать, если вы хотите запустить приложение с помощью одной короткой команды. Вы можете указать дополнительные зависимые файлы jar в своем манифесте, используя разделенные пробелом Jar в записи пути к классу, например:

Class-Path: mysql.jar infobus.jar acme/beans.jar

оба сопоставимы с точки зрения производительности.

там не будет никакой разницы с точки зрения производительности. Используя java-cp, мы можем указать необходимые классы и jar в classpath для запуска файла класса java.

Если это исполняемый файл jar . Когда используется команда java-jar, jvm находит класс, который ему нужно запустить из /META-INF/MANIFEST.Файл MF внутри файла jar.

Как уже было сказано,- cp просто указывает jvm в командной строке, какой класс использовать для основного потока и где он может найти библиотеки (определить путь к классу). In-jar он ожидает, что путь к классу и основной класс будут определены в манифесте файла jar. Таким образом, другие предназначены для определения вещей в командной строке, а другие находят их внутри манифеста jar. Нет никакой разницы в производительности. Вы не можете использовать их одновременно, -jar переопределит-cp.

хотя даже если вы используете -cp, он все равно будет проверять файл манифеста. Таким образом, вы можете определить некоторые пути к классам в манифесте и некоторые в командной строке. Это особенно полезно, когда у вас есть зависимость от какой-то сторонней jar, которую вы не можете предоставить с помощью своей сборки или не хотите предоставлять (ожидая, что она будет найдена уже в системе, где она должна быть установлена, например). Таким образом, вы можете использовать его для обеспечения внешних банок. Это место может отличаться между системами или даже может иметь разные версия на другой системе (но с одинаковыми интерфейсами). Таким образом, вы можете построить приложение с другой версией и добавить фактическую зависимость 3rd party к class-path в командной строке при запуске его на разных системах.

Comments

    Ничего не найдено.