แบบสั้น: หากหลักของคุณอยู่ในขวดคุณอาจต้องใช้ '-jar pathTo / yourJar / YourJarsName.jar' ประกาศอย่างชัดเจนเพื่อให้มันทำงานได้ (แม้ว่า 'YourJarsName.jar' จะอยู่ใน classpath) (หรือ แสดงเพื่อตอบคำถามเดิมที่ถูกถามเมื่อ 5 ปีที่แล้ว: คุณไม่จำเป็นต้องประกาศซ้ำแต่ละขวดอย่างชัดเจน แต่ดูเหมือนว่าแม้จะมี java6 คุณต้องประกาศใหม่ขวดของคุณเอง ... )
แบบยาว: (ฉันได้ทำสิ่งนี้อย่างชัดเจนจนถึงจุดที่ฉันหวังว่าแม้กระทั่ง interlopers ของ java สามารถใช้สิ่งนี้ได้)
ชอบมากที่นี่ฉันใช้ eclipse เพื่อส่งออกไห: (ไฟล์ -> ส่งออก -> 'ไฟล์ JAR Runnable') ข้อเสนอ eclipse (Juno) ของข้อเสนอมีสามตัวเลือก:
opt1: "Extract required libraries into generated JAR"
opt2: "Package required libraries into generated JAR"
opt3: "Copy required libraries into a sub-folder next to the generated JAR"
โดยทั่วไปแล้วฉันจะใช้ opt2 (และ opt1 แตกหักอย่างแน่นอน) อย่างไรก็ตามรหัสท้องถิ่นในขวดที่ฉันใช้ฉันค้นพบตัวแบ่งด้วยเคล็ดลับ "jarinjar" ที่มีประโยชน์ซึ่ง eclipse จะยกระดับเมื่อคุณเลือกตัวเลือกนั้น แม้หลังจากรู้ตัวว่าฉันต้องการ opt3 แล้วค้นหารายการ StackOverflow นี้ฉันยังต้องใช้เวลาพอสมควรในการหาวิธีเริ่มต้นหลักนอก eclipse ดังนั้นนี่คือสิ่งที่ใช้ได้ผลกับฉันเพราะมันมีประโยชน์สำหรับผู้อื่น ...
หากคุณตั้งชื่อ jar ของคุณ: "fooBarTheJarFile.jar" และทั้งหมดถูกตั้งค่าให้ส่งออกไปยัง dir: "/ theFully / ที่มีคุณสมบัติครบถ้วนPath / toYourChosenDir"
(หมายถึงฟิลด์ 'ส่งออกปลายทาง' จะอ่าน: '/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar')
หลังจากที่คุณกดปุ่มเสร็จคุณจะพบ eclipse และใส่ไลบรารี่ทั้งหมดลงในโฟลเดอร์ชื่อ 'fooBarTheJarFile_lib' ภายในไดเรกทอรีส่งออกนั้นให้สิ่งที่คุณต้องการ:
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar
จากนั้นคุณสามารถเปิดจากที่ใดก็ได้ในระบบของคุณด้วย:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(สำหรับ Java Newbies: 'package.path_to.the_class_with.your_main' เป็นพา ธ แพ็กเกจที่ประกาศซึ่งคุณจะพบที่ด้านบนของไฟล์ 'TheClassWithYourMain.java' ที่มีเนื้อหา 'main (String [] args) .} 'ที่คุณต้องการเรียกใช้จาก java ภายนอก)
ข้อผิดพลาดที่ควรสังเกต: คือการมี 'fooBarTheJarFile.jar' อยู่ในรายการขวดบน classpath ที่คุณประกาศไม่เพียงพอ คุณต้องประกาศ '-jar' อย่างชัดเจนและประกาศตำแหน่งของ jar นั้นอีกครั้ง
เช่นการแบ่งนี้:
java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain
ปรับปรุงใหม่ด้วยเส้นทางญาติ:
cd /theFully/qualifiedPath/toYourChosenDir/;
BREAKS: java -cp "fooBarTheJarFile_lib/*" package.path_to.the_class_with.your_main.TheClassWithYourMain
BREAKS: java -cp ".;fooBarTheJarFile_lib/*" package.path_to.the_class_with.your_main.TheClassWithYourMain
BREAKS: java -cp ".;fooBarTheJarFile_lib/*" -jar package.path_to.the_class_with.your_main.TheClassWithYourMain
WORKS: java -cp ".;fooBarTheJarFile_lib/*" -jar fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain
(ใช้รุ่นจาวา "1.6.0_27"; ผ่าน OpenJDK 64- บิตเซิร์ฟเวอร์ VM บน Ubuntu 12.04)