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


Apa perbedaan antara menjalankan aplikasi Java dengan
java -cp CLASSPATH dan java -jar JAR_FILE_PATH? Apakah salah satu dari mereka lebih suka yang lain untuk menjalankan aplikasi Java? Maksud saya yang mana dari cara-cara ini lebih mahal untuk JVM (menurut penggunaan sumber daya mesin mereka)?

Mana yang akan menyebabkan JVM untuk menelurkan lebih banyak benang saat mencoba menjalankan aplikasi?


76
2017-08-12 13:52


asal


Jawaban:


Saya lebih suka versi pertama untuk memulai aplikasi java hanya karena memiliki lebih sedikit perangkap ("selamat datang di neraka classpath"). Yang kedua membutuhkan file jar executable dan classpath untuk aplikasi yang harus didefinisikan di dalam jar's manifes (semua deklarasi classpath lain akan diam-diam diabaikan ...). Jadi dengan versi kedua Anda harus melihat ke dalam toples, membaca manifes dan mencoba mencari tahu apakah entri classpath valid dari mana stoples disimpan ... Itu bisa dihindari.

Saya tidak mengharapkan keuntungan atau kerugian kinerja untuk salah satu versi. Itu hanya memberi tahu jvm kelas mana yang digunakan untuk utas utama dan di mana ia dapat menemukan pustaka.


62
2017-08-12 13:59



Dengan -cp argumen Anda memberikan path classpath (s) ke kelas tambahan atau pustaka yang mungkin diperlukan program Anda saat dikompilasi atau dijalankan. Dengan -jar Anda menentukan file JAR yang dapat dieksekusi yang ingin Anda jalankan.

Anda tidak dapat menentukan keduanya. Jika Anda mencoba untuk berlari java -cp folder/myexternallibrary.jar -jar myprogram.jar maka itu tidak akan berhasil. Classpath untuk JAR itu harus ditentukan dalam Manifesnya, bukan sebagai -cp argumen.

Anda dapat menemukan lebih banyak tentang ini sini dan sini.

PS: -cp dan -classpath adalah sinonim.


46
2017-08-12 13:56



Ketika menggunakan java -cp Anda harus memberikan nama kelas utama yang sepenuhnya memenuhi syarat, mis.

java -cp com.mycompany.MyMain

Ketika menggunakan java -jar myjar.jar file jar Anda harus memberikan informasi tentang kelas utama melalui manifest.mf yang terkandung dalam file jar dalam folder META-INF:

Main-Class: com.mycompany.MyMain


10
2017-08-12 13:57



java -cp CLASSPATH adalah keharusan jika Anda ingin menentukan semua kode di classpath. Ini berguna untuk mendebug kode.

Format eksekusi yang terinjak: java -jar JarFile dapat digunakan jika Anda ingin memulai aplikasi dengan satu perintah singkat. Anda dapat menentukan file jar tergantung tambahan dalam MANIFEST Anda menggunakan guci terpisah ruang dalam entri Kelas-Jalur, misalnya:

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

Keduanya sebanding dalam hal kinerja.


10
2017-08-12 13:57



Tidak akan ada perbedaan dalam hal kinerja. Menggunakan java - cp kita dapat menentukan kelas yang diperlukan dan jar di classpath 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.


1
2017-08-12 15:57



Seperti sudah dikatakan, -cp hanya untuk memberi tahu jvm di baris perintah yang kelas digunakan untuk utas utama dan di mana ia dapat menemukan pustaka (tentukan classpath). Dalam -jar ia mengharapkan class-path dan kelas utama untuk didefinisikan dalam manifest file jar. Jadi yang lain adalah untuk mendefinisikan hal-hal dalam baris perintah sementara yang lain menemukannya di dalam manifes jar. Tidak ada perbedaan dalam kinerja. Anda tidak dapat menggunakannya pada saat yang sama, -jar akan menimpa -cp.

Meskipun bahkan jika Anda menggunakan -cp, ia masih akan memeriksa file manifes. Jadi Anda dapat menentukan beberapa jalur kelas dalam manifes dan beberapa di baris perintah. Ini sangat berguna ketika Anda memiliki ketergantungan pada beberapa toples pihak ke-3, yang mungkin tidak Anda berikan dengan build Anda atau tidak ingin berikan (mengharapkannya sudah ditemukan dalam sistem di mana itu akan diinstal misalnya). Jadi Anda bisa menggunakannya untuk menyediakan guci eksternal. Lokasi mungkin berbeda antar sistem atau bahkan mungkin memiliki versi berbeda pada sistem yang berbeda (tetapi memiliki antarmuka yang sama). Dengan cara ini Anda dapat membangun aplikasi dengan versi lain dan menambahkan ketergantungan pihak ke-3 yang sebenarnya ke jalur kelas pada baris perintah saat menjalankannya pada sistem yang berbeda.


1
2018-02-03 07:21