Dalam beberapa kasus suatu program dapat dijalankan dengan cara yang berbeda dan menunjukkan perilaku yang berbeda tentang bagaimana program itu disebut. Jika Anda memanggil vim
sebagai vi
, itu berjalan dalam mode kompatibilitas. Kadang-kadang untuk mencoba mempertahankan satu versi dari beberapa program terkait - misalnya mailq
dan newaliases
pada banyak sistem unix adalah tautan ke sendmail
sehingga program-program ini tetap sinkron)
Program Java biasanya dipanggil sebagai:
% java -jar foo.jar args
% java Foo args
Versi pertama adalah di mana Anda memiliki file Manifest yang menunjukkan kelas utama, versi kedua menjalankan metode utama di kelas yang Foo
ditemukan di jalur kelas.
Informasi yang disajikan untuk Jawa adalah jalur ke tabung atau nama kelas yang dipanggil.
Lokasi toples tidak cukup penting untuk dijadikan kode tempat (dan sebenarnya bukan bagian dari spek asli). Jar dapat diberi nama apa saja, dan sering kali menyertakan nomor versi. Terlebih lagi, tidak ada jaminan bahwa kelas itu bahkan disimpan dalam .jar (itu bisa saja diekstraksi).
Menjalankan aplikasi Java dengan -jar
hanya memiliki satu cara untuk memasukkannya - kelas yang ditentukan dalam Manifest. Tidak ada penggantian nama yang bisa dilakukan.
Pilihan lain, dari memohonnya dengan nama kelas menunjuk langsung ke unit eksekusi. Selain itu, tidak dapat dinamai multiply - Anda tidak dapat Bar.class
menjadi kode untuk class Foo
itu tidak berfungsi seperti itu.
Ini harus menunjukkan bahwa benar-benar tidak ada gunanya menyampaikan informasi argv[0]
dalam arti C ke aplikasi Java - itu akan menjadi java
, tidak berarti dan sewenang-wenang, atau nama kelas yang dipanggil (bahwa Anda sudah menjalankan kode keluar dari (Anda bisa melakukan sesuatu seperti getClass().getEnclosingClass().getName()
jika Anda putus asa ...)).
Ada titik di sini, Anda dapat mendefinisikan beberapa metode utama di kelas dalam .jar atau di jalur kelas. Dan Anda dapat membuat mereka berperilaku berbeda seolah-olah ada serangkaian pernyataan jika berdasarkan apa argv[0]
itu.
Di masa lalu saya memiliki kode yang mirip dengan java -cp Foo.jar com.me.foo.Test
yang menggunakan Test
metode utama kelas daripada yang didefinisikan dalam satu yang didefinisikan dalam Manifest.
foo.exe
.java com.me.Foo
sebagai baris perintah, metodecom.me.Foo.main(String...)
ini dipanggil. Tidak ada cara selain itu. Dan saya tahu bahwa itu Foo yang sedang dipanggil - tidak ada alasan untuk tetap dalam argumen itu. Itu akan menjadi informasi yang berlebihan. Tentu, itu bisa di kelas super, tapi saya punya kesempatan sepele untuk mencegatnya dengan informasi yang diinginkan tentang apa permintaan baris perintah - tidak perlu memasukkannya ke dalam argv.sebenarnya tidak ada manfaatnya, itu benar-benar tergantung pada sintaks bahasa pemrograman yang Anda gunakan jika berbasis 0 atau 1. variabel (Anda sebut sebagai nama file) juga tergantung pada bahasanya, bisa berbeda di bahasa lain cukup ikuti sintaks yang benar dari bahasa yang Anda gunakan.
sumber