Відмінності між "java -cp" та "java -jar"?


118

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

Який з них призведе до появи невідкладної кількості JVM під час спроби запуску програми?

Відповіді:


97

Я вважаю за краще, щоб перша версія запускала програму java лише тому, що вона має менше підводних каменів ("Ласкаво просимо в пекло classpath"). Другий вимагає виконуваного файлу jar і класний шлях для цієї програми повинен бути визначений у маніфесті jar (усі інші декларації classpath будуть мовчки ігноруватися ...). Тож із другою версією вам доведеться зазирнути в банку, прочитати маніфест і спробувати з’ясувати, чи є записи класного шляху дійсними з того місця, де зберігається jar ... Це неможливо.

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


Що з нитками? Чи однакові вони за кількістю потоків, які JVM нерегулярно намагаються запустити додаток?
Реза

1
Так. Обидві версії знайдуть основний метод і виконають його одним потоком. Перша версія передає ім'я класу як аргумент, а друга версія jvm знайде його всередині mainfest.
Андреас Долк

@Andreas_D Будь ласка, погляньте на цю публікацію , я думаю, я використовую -cp неправильно, і я не можу виправити свою помилку.
fu DL

60

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

Ви не можете вказати їх обох. Якщо ви спробуєте запустити, java -cp folder/myexternallibrary.jar -jar myprogram.jarто це справді не вийде. Класовий шлях для цього JAR повинен бути вказаний у Маніфесті, а не як -cpаргумент.

Більше про це можна дізнатися тут і тут .

PS: -cpі -classpathє синонімами.


Мене хвилює питання про ресурси? Чи є різниця між ресурсами, якими вони користуються?
Реза

@Hesam Якщо ви запитуєте про відмінності в продуктивності між -cpі -classpath, то ні, різниці немає.
Раду Мурзеа

1
Немає! Я мав на увазі різницю у виконанні між -cp (або -classpath) та -jar
Reza

2
@Hesam З -jarвами вкажіть, який виконуваний файл JAR ви хочете запустити. З -cpвами вкажіть шлях до додаткових класів / бібліотеки, який може знадобитися вашій програмі. Ці 2 мають дуже різні цілі.
Раду Мурзеа

@RaduMurzea, що ти означає, що насправді це не спрацює, коли ми поєднаємо їх? Напр.java -jar PATH -cp PATH2
Pacerier

18

Під час використання java -cpвам потрібно надати повністю кваліфіковану назву основного класу, наприклад

java -cp com.mycompany.MyMain

При використанні java -jar myjar.jarфайлу jar необхідно надати інформацію про основний клас через manifest.mf, що міститься у файлі jar у папці META-INF:

Main-Class: com.mycompany.MyMain


Будь ласка, погляньте на цю публікацію , я думаю, я використовую -cp неправильно, і я не можу виправити свою помилку.
фу DL

10

java -cp CLASSPATH є необхідним, якщо ви хочете вказати весь код на classpath. Це корисно для налагодження коду.

Формат виконуваного файлу: java -jar JarFileможе бути використаний, якщо ви хочете запустити додаток за допомогою однієї короткої команди. Ви можете вказати додаткові залежні файли jar у вашому MANIFEST, використовуючи розділені пробілами банки в записі Class-Path, наприклад:

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

Обидва порівнянні за показниками продуктивності.


Будь ласка, погляньте на цю публікацію , я думаю, я використовую -cp неправильно, і я не можу виправити свою помилку.
фу DL

2

Як вже було сказано, -cp - це просто сказати jvm у командному рядку, який клас використовувати для основного потоку та де він може знайти бібліотеки (визначити classpath). В -jar він очікує, що шлях до класу та основний клас будуть визначені в маніфесті файлу jar. Тож інше призначене для визначення речей у командному рядку, а інших знаходження їх у маніфесті jar. Різниці в продуктивності немає. Ви не можете їх одночасно використовувати, -jar замінить -cp.

Хоча навіть якщо ви використовуєте -cp, він все одно перевірятиме файл маніфесту. Таким чином, ви можете визначити деякі шляхи до класу в маніфесті, а деякі в командному рядку. Це особливо корисно, коли у вас є залежність від якоїсь сторонньої банки, яку ви можете не забезпечити своєю збіркою або не хочете надавати її (очікуючи, що вона знайдеться вже в системі, де вона буде встановлена, наприклад). Тож ви можете використовувати його для подачі зовнішніх баночок. Її розташування може відрізнятися між системами або навіть може мати іншу версію в іншій системі (але має однакові інтерфейси). Таким чином, ви можете створити додаток за допомогою іншої версії та додати фактичну залежність від стороннього класу до контуру в командному рядку під час його запуску в різних системах.


1

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

Якщо це виконуваний jar файл. Коли використовується команда java -jar, jvm знаходить клас, який йому потрібно запустити з /META-INF/MANIFEST.MF-файлу всередині файлу jar.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.