ในบางกรณีโปรแกรมสามารถทำงานในรูปแบบที่แตกต่างกันและแสดงพฤติกรรมที่แตกต่างกันในวิธีที่เรียกว่า หากคุณโทรvim
เป็นvi
มันจะทำงานในโหมดความเข้ากันได้ บางครั้งก็พยายามที่จะรักษาหนึ่งเวอร์ชันของหลาย ๆ โปรแกรมที่เกี่ยวข้อง - ตัวอย่างเช่นmailq
และnewaliases
ในระบบยูนิกซ์หลาย ๆ อันนั้นเป็นลิงค์เพื่อsendmail
ให้โปรแกรมเหล่านี้ยังคงซิงค์อยู่)
โดยปกติแล้วโปรแกรม Java จะถูกเรียกใช้เป็น:
% java -jar foo.jar args
% java Foo เกิดขึ้น
รุ่นแรกคือที่ที่คุณมีไฟล์มานิเฟสต์ซึ่งระบุคลาสหลักรุ่นที่สองจะรันเมธอดหลักในคลาสที่Foo
พบในพา ธ ของคลาส
ข้อมูลที่นำเสนอสำหรับ Java เป็นเส้นทางไปยัง jar หรือชื่อของคลาสที่ถูกเรียกใช้
ตำแหน่งของโถไม่สำคัญพอที่จะเป็นรหัสจาก (และจริง ๆ แล้วไม่ได้เป็นส่วนหนึ่งของข้อมูลจำเพาะดั้งเดิม) Jar สามารถตั้งชื่ออะไรก็ได้จริง ๆ และมักจะมีหมายเลขรุ่น ยิ่งไปกว่านั้นไม่มีอะไรรับประกันได้ว่าชั้นจะถูกเก็บไว้ใน. jar (มันสามารถถูกดึงออกมา)
การเรียกใช้แอปพลิเคชัน Java ด้วย-jar
มีเพียงวิธีเดียวในการป้อนคลาสที่กำหนดใน Manifest ไม่มีการเปลี่ยนชื่อที่สามารถทำได้
ตัวเลือกอื่นของการเรียกใช้พร้อมกับชื่อคลาสชี้ไปยังหน่วยดำเนินการโดยตรง อีกต่อไปมันไม่สามารถตั้งชื่อคูณ - คุณไม่สามารถBar.class
เป็นรหัสสำหรับclass Foo
มันก็ไม่ได้ทำงานอย่างนั้น
นี่ควรจะแสดงให้เห็นว่าไม่มีจุดใดที่จะส่งผ่านข้อมูลของargv[0]
ในภาษา C ไปยังแอปพลิเคชัน Java ซึ่งอาจเป็นไปได้java
ไร้ความหมายและไม่มีกฎเกณฑ์หรือชื่อของคลาสที่ถูกเรียกใช้ จาก (คุณสามารถทำบางอย่างเช่นgetClass().getEnclosingClass().getName()
ถ้าคุณหมดหวัง ... )
มีจุดที่นี่คุณสามารถกำหนดหลายวิธีการหลักในชั้นเรียนใน. jar หรือบนเส้นทางชั้นเรียน และคุณสามารถทำให้พวกมันมีพฤติกรรมที่แตกต่างราวกับว่ามีชุดของคำสั่งที่ยึดตามสิ่งที่argv[0]
เป็นอยู่
ฉันมีในอดีตมีรหัสคล้ายกับjava -cp Foo.jar com.me.foo.Test
ที่เรียกTest
วิธีการหลักของชั้นเรียนมากกว่าที่กำหนดไว้ในหนึ่งที่กำหนดไว้ในรายการ
foo.exe
แต่แอพลิเคชันมักจะถูกดำเนินการโดยตรงเพียง