Perbedaan antara "java -cp" dan "java -jar"?

118

Apa perbedaan antara menjalankan aplikasi Java dengan
java -cp CLASSPATHdan java -jar JAR_FILE_PATH? Apakah salah satunya lebih disukai daripada yang lain untuk menjalankan aplikasi Java? Maksud saya, cara mana yang lebih mahal untuk JVM (menurut penggunaan sumber daya mesin mereka)?

Manakah yang akan menyebabkan JVM menelurkan lebih banyak utas saat mencoba menjalankan aplikasi?

Reza
sumber

Jawaban:

97

Saya lebih suka versi pertama untuk memulai aplikasi java hanya karena ia memiliki lebih sedikit jebakan ("selamat datang di classpath hell"). Yang kedua membutuhkan file jar yang dapat dieksekusi dan classpath untuk aplikasi itu harus ditentukan di dalam manifes jar (semua deklarasi classpath lainnya akan diabaikan secara diam-diam ...). Jadi dengan versi kedua Anda harus melihat ke dalam toples, membaca manifes dan mencoba mencari tahu apakah entri classpath valid dari tempat penyimpanan jar ... Itu bisa dihindari.

Saya tidak mengharapkan kelebihan atau kekurangan kinerja untuk versi mana pun. Ini hanya memberi tahu jvm kelas mana yang akan digunakan untuk utas utama dan di mana ia dapat menemukan perpustakaan.

Andreas Dolk
sumber
Bagaimana dengan utasnya? Apakah mereka sama dalam hal jumlah utas yang ditelurkan JVM saat mencoba menjalankan aplikasi?
Reza
1
Iya. Kedua versi akan menemukan metode utama dan menjalankannya dengan satu utas. Versi pertama meneruskan nama kelas sebagai argumen, dengan versi kedua, jvm akan menemukannya di dalam mainfest.
Andreas Dolk
@Andreas_D Tolong lihat posting ini , saya kira saya menggunakan -cp dengan cara yang salah, dan saya tidak bisa memperbaiki kesalahan saya.
fu DL
60

Dengan -cpargumen Anda memberikan jalur kelas yaitu jalur ke kelas atau pustaka tambahan yang mungkin diperlukan oleh program Anda saat sedang dikompilasi atau dijalankan. Dengan -jarAnda menentukan file JAR yang dapat dieksekusi yang ingin Anda jalankan.

Anda tidak dapat menentukan keduanya. Jika Anda mencoba menjalankannya java -cp folder/myexternallibrary.jar -jar myprogram.jarmaka itu tidak akan berhasil. Jalur kelas untuk JAR tersebut harus ditentukan dalam Manifesnya, bukan sebagai -cpargumen.

Anda dapat menemukan lebih banyak tentang ini di sini dan di sini .

PS: -cpdan -classpathmerupakan sinonim.

Radu Murzea
sumber
Perhatian saya adalah tentang sumber daya? apakah ada perbedaan antara sumber daya yang mereka gunakan?
Reza
@Hesam Jika Anda bertanya tentang perbedaan kinerja antara -cpdan -classpath, maka tidak, tidak ada perbedaan.
Radu Murzea
1
Tidak! Yang saya maksud adalah perbedaan kinerja antara -cp (atau -classpath) dan -jar
Reza
2
@Hesam Dengan -jarAnda menentukan JAR yang dapat dieksekusi yang ingin Anda jalankan. Dengan -cpAnda menentukan jalur ke kelas / pustaka tambahan yang mungkin diperlukan oleh program Anda. Keduanya memiliki tujuan yang sangat berbeda.
Radu Murzea
@RaduMurzea, Apa maksudmu itu tidak akan benar - benar berfungsi ketika kita menggabungkannya? Misalnyajava -jar PATH -cp PATH2
Pacerier
18

Saat menggunakan java -cpAnda diminta untuk memberikan nama kelas utama yang memenuhi syarat, misalnya

java -cp com.mycompany.MyMain

Saat menggunakan java -jar myjar.jarfile jar Anda harus memberikan informasi tentang kelas utama melalui manifest.mf yang terdapat di dalam file jar di folder META-INF:

Main-Class: com.mycompany.MyMain

AlexR
sumber
Tolong lihat posting ini , saya kira saya menggunakan -cp dengan cara yang salah, dan saya tidak bagaimana memperbaiki kesalahan saya.
fu DL
10

java -cp CLASSPATH diperlukan jika Anda ingin menentukan semua kode di classpath. Ini berguna untuk men-debug kode.

Format yang java -jar JarFiledapat dieksekusi dengan jarred: dapat digunakan jika Anda ingin memulai aplikasi dengan satu perintah singkat. Anda dapat menentukan file jar dependen tambahan di MANIFEST Anda menggunakan botol yang dipisahkan spasi di entri Class-Path, misalnya:

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

Keduanya sebanding dalam hal performa.

Reimeus
sumber
Tolong lihat posting ini , saya kira saya menggunakan -cp dengan cara yang salah, dan saya tidak bagaimana memperbaiki kesalahan saya.
fu DL
2

Seperti yang sudah dikatakan, -cp hanya untuk memberi tahu jvm di baris perintah kelas mana yang akan digunakan untuk utas utama dan di mana ia dapat menemukan perpustakaan (mendefinisikan jalur kelas). Dalam -jar, class-path dan main-class akan ditentukan dalam manifes file jar. Jadi yang lain adalah untuk mendefinisikan hal-hal dalam baris perintah sementara yang lain menemukannya di dalam manifes jar. Tidak ada perbedaan kinerja. Anda tidak dapat menggunakannya secara bersamaan, -jar akan mengganti -cp.

Meskipun Anda menggunakan -cp, itu masih akan memeriksa file manifes. Jadi, Anda dapat menentukan beberapa jalur kelas di manifes dan beberapa di baris perintah. Ini sangat berguna ketika Anda memiliki ketergantungan pada beberapa jar pihak ke-3, yang mungkin tidak Anda sediakan dengan build Anda atau tidak ingin Anda sediakan (berharap itu sudah ditemukan di sistem tempat ia akan diinstal misalnya). Jadi Anda bisa menggunakannya untuk menyediakan stoples eksternal. Lokasinya dapat bervariasi antar sistem atau bahkan mungkin memiliki versi yang berbeda pada sistem yang berbeda (tetapi memiliki antarmuka yang sama). Dengan cara ini Anda dapat membuat aplikasi dengan versi lain dan menambahkan dependensi pihak ketiga yang sebenarnya ke jalur kelas pada baris perintah saat menjalankannya pada sistem yang berbeda.

Pehmolelu
sumber
1

Tidak akan ada perbedaan dalam hal performa. Menggunakan java - cp kita dapat menentukan kelas dan jar yang diperlukan di jalur kelas untuk menjalankan file kelas java.

Jika itu adalah file jar yang dapat dieksekusi. Ketika perintah java -jar digunakan, jvm menemukan kelas yang perlu dijalankan dari file /META-INF/MANIFEST.MF di dalam file jar.

ravi sankar reddy
sumber