ความแตกต่างระหว่าง“ java -cp” และ“ java -jar”?


118

อะไรคือความแตกต่างระหว่างการเรียกใช้แอปพลิเคชัน Java กับ
java -cp CLASSPATHและjava -jar JAR_FILE_PATH? หนึ่งในนั้นเป็นที่ต้องการสำหรับการเรียกใช้แอปพลิเคชัน Java หรือไม่ ฉันหมายถึงวิธีใดต่อไปนี้ที่มีราคาแพงกว่าสำหรับ JVM (ตามการใช้ทรัพยากรเครื่อง)

ข้อใดจะทำให้ JVM เกิดเธรดมากขึ้นในขณะที่พยายามเรียกใช้แอปพลิเคชัน

คำตอบ:


97

ฉันชอบเวอร์ชันแรกเพื่อเริ่มแอปพลิเคชัน java เพียงเพราะมีข้อผิดพลาดน้อยกว่า ("ยินดีต้อนรับสู่ classpath hell") อันที่สองต้องการไฟล์ jar ที่เรียกใช้งานได้และคลาสพา ธ สำหรับแอ็พพลิเคชันนั้นจะต้องถูกกำหนดไว้ในไฟล์ Manifest ของ jar (การประกาศ classpath อื่น ๆ ทั้งหมดจะถูกละเว้นโดยไม่โต้ตอบ ... ) ดังนั้นในเวอร์ชันที่สองคุณจะต้องมองเข้าไปใน jar อ่านรายการและพยายามค้นหาว่ารายการ classpath ถูกต้องจากที่จัดเก็บ jar หรือไม่ ...

ฉันไม่คาดหวังข้อดีหรือข้อเสียด้านประสิทธิภาพสำหรับทั้งสองเวอร์ชัน เป็นเพียงการบอก jvm ว่าจะใช้คลาสใดสำหรับเธรดหลักและจะหาไลบรารีได้ที่ไหน


แล้วกระทู้ล่ะ มันเหมือนกันในแง่ของจำนวนเธรดที่ JVM วางไข่ขณะพยายามเรียกใช้แอปพลิเคชันหรือไม่?
Reza

1
ใช่. ทั้งสองเวอร์ชันจะค้นหาวิธีการหลักและดำเนินการด้วยเธรดเดียว เวอร์ชันแรกส่งชื่อคลาสเป็นอาร์กิวเมนต์โดยเวอร์ชันที่สอง jvm จะพบได้ภายใน mainfest
Andreas Dolk

@Andreas_D โปรดดูที่โพสต์นี้ฉันเดาว่าฉันใช้ -cp ในทางที่ผิดและฉันไม่สามารถแก้ไขข้อผิดพลาดได้อย่างไร
fu DL

60

ด้วย-cpอาร์กิวเมนต์คุณระบุ classpath เช่น path (s) ไปยังคลาสหรือไลบรารีเพิ่มเติมที่โปรแกรมของคุณอาจต้องการเมื่อคอมไพล์หรือรัน เมื่อ-jarคุณระบุไฟล์ JAR ที่ปฏิบัติการได้ที่คุณต้องการเรียกใช้

คุณไม่สามารถระบุทั้งคู่ได้ ถ้าลองรันjava -cp folder/myexternallibrary.jar -jar myprogram.jarแล้วมันใช้ไม่ได้จริงๆ classpath สำหรับ JAR นั้นควรระบุไว้ใน Manifest ไม่ใช่เป็น-cpอาร์กิวเมนต์

ท่านสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่และที่นี่

PS: -cpและ-classpathเป็นคำพ้องความหมาย


ความกังวลของฉันเกี่ยวกับทรัพยากร? ทรัพยากรที่ใช้มีความแตกต่างกันหรือไม่
Reza

@Hesam หากคุณถามเกี่ยวกับความแตกต่างของประสิทธิภาพระหว่าง-cpและ-classpathไม่ก็ไม่มีความแตกต่าง
Radu Murzea

1
No! ฉันหมายถึงความแตกต่างของประสิทธิภาพระหว่าง -cp (หรือ -classpath) และ -jar
Reza

2
@Hesam เมื่อ-jarคุณระบุ JAR ที่เรียกใช้งานได้ที่คุณต้องการเรียกใช้ เมื่อ-cpคุณระบุพา ธ ไปยังคลาส / ไลบรารีเพิ่มเติมที่โปรแกรมของคุณอาจต้องการ ทั้ง 2 มีวัตถุประสงค์ที่แตกต่างกันมาก
Radu Murzea

@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 ในทางที่ผิดและฉันไม่สามารถแก้ไขข้อผิดพลาดได้อย่างไร
fu DL

10

java -cp CLASSPATH เป็นสิ่งจำเป็นหากคุณต้องการระบุรหัสทั้งหมดใน classpath สิ่งนี้มีประโยชน์สำหรับการดีบักโค้ด

รูปแบบที่java -jar JarFileสามารถเรียกใช้งานได้jarred: สามารถใช้ได้หากคุณต้องการเริ่มแอพด้วยคำสั่งสั้น ๆ เพียงคำสั่งเดียว คุณสามารถระบุไฟล์ jar ที่ขึ้นกับเพิ่มเติมใน MANIFEST ของคุณโดยใช้ jar ที่คั่นด้วยช่องว่างในรายการ Class-Path เช่น:

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

ทั้งสองเทียบเคียงกันในแง่ของประสิทธิภาพ


โปรดดูที่โพสต์นี้ฉันเดาว่าฉันใช้ -cp ในทางที่ผิดและฉันไม่สามารถแก้ไขข้อผิดพลาดได้อย่างไร
fu DL

2

ดังที่ได้กล่าวไปแล้ว -cp เป็นเพียงเพื่อบอก jvm ในบรรทัดคำสั่งว่าจะใช้คลาสใดสำหรับเธรดหลักและตำแหน่งที่สามารถค้นหาไลบรารีได้ (กำหนด classpath) ใน -jar คาดว่า class-path และ main-class จะถูกกำหนดในรายการไฟล์ jar อื่น ๆ คือการกำหนดสิ่งต่าง ๆ ในบรรทัดคำสั่งในขณะที่คนอื่นค้นหาสิ่งเหล่านี้ในรายการ jar มีประสิทธิภาพไม่แตกต่างกัน คุณไม่สามารถใช้พร้อมกันได้ -jar จะแทนที่ -cp

แม้ว่าคุณจะใช้ -cp แต่ก็ยังตรวจสอบไฟล์รายการ ดังนั้นคุณสามารถกำหนดคลาส - พา ธ บางส่วนในรายการและบางส่วนในบรรทัดคำสั่ง สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องพึ่งพาโถของบุคคลที่สามซึ่งคุณอาจไม่ได้ให้มาพร้อมกับบิลด์ของคุณหรือไม่ต้องการให้ (คาดว่าจะพบอยู่แล้วในระบบที่จะติดตั้งเป็นต้น) คุณจึงสามารถใช้เพื่อจัดหาขวดโหลภายนอกได้ ตำแหน่งอาจแตกต่างกันไประหว่างระบบหรืออาจมีเวอร์ชันที่แตกต่างกันในระบบอื่น (แต่มีอินเทอร์เฟซเดียวกัน) ด้วยวิธีนี้คุณสามารถสร้างแอปด้วยเวอร์ชันอื่นและเพิ่มการอ้างอิงของบุคคลที่สามจริงไปยังคลาสพา ธ บนบรรทัดคำสั่งเมื่อรันบนระบบต่างๆ


1

จะไม่มีความแตกต่างในแง่ของประสิทธิภาพ การใช้ java - cp เราสามารถระบุคลาสและ jar ที่ต้องการใน classpath เพื่อเรียกใช้ไฟล์คลาส java

หากเป็นไฟล์ jar ที่เรียกใช้งานได้ เมื่อใช้คำสั่ง java -jar jvm จะค้นหาคลาสที่ต้องการรันจากไฟล์ /META-INF/MANIFEST.MF ภายในไฟล์ jar

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.