เหตุใดจึงไม่สามารถโหลดแอตทริบิวต์รายการระดับหลักจากไฟล์ JAR


85

ฉันสร้างไฟล์ JAR ด้วยวิธีjar cf jar-file input-filesนี้ ตอนนี้ฉันกำลังพยายามรัน การรันไม่ทำงาน (ไม่พบคำสั่ง jre):

jre -cp app.jar MainClass

สิ่งนี้ใช้ไม่ได้:

java -jar main.jar

(ไม่สามารถโหลดแอตทริบิวต์รายการระดับหลักจาก main.jar)

ฉันยังพบว่า

ในการเรียกใช้แอปพลิเคชันที่บรรจุเป็นไฟล์ JAR (เวอร์ชัน 1.2 - ต้องใช้ส่วนหัวของรายการหลัก)

"Main-Class manifest header" คืออะไร ฉันจะสร้างมันได้อย่างไรและฉันจะวางไว้ที่ไหน?

คำตอบ:


62

ฉันไม่แน่ใจว่าฉันเชื่ออาการของคุณ:

  • หากjreไม่พบคำสั่งการรันjre -cp app.jarควรให้ข้อผิดพลาดเดียวกัน
  • การเพิ่มไฟล์JARลงใน classpath ไม่ควรให้เกิดข้อผิดพลาดที่คุณเห็น

ฉันคาดว่าคุณจะเห็นข้อผิดพลาดนี้หากคุณเรียกใช้:

java -jar app.jar

ส่วนหัวของ Main-Class ต้องอยู่ในรายการสำหรับไฟล์ JAR ซึ่งเป็นข้อมูลเมตาเกี่ยวกับสิ่งต่างๆเช่นไลบรารีที่จำเป็นอื่น ๆ ดูเอกสาร Sunสำหรับวิธีสร้างรายการที่เหมาะสม โดยทั่วไปคุณต้องสร้างไฟล์ข้อความซึ่งมีบรรทัดดังนี้:

Main-Class: MainClass

จากนั้นเรียกใช้

jar cfm app.jar manifest.txt *.class

ขอขอบคุณ. มันได้ผล. ฉันสร้างไฟล์รายการด้วยMain-Class: MainClassไฟล์. jar จากนั้นสร้างด้วยคำสั่งที่คุณให้ java -jar main.jarหลังจากนั้นฉันก็สามารถที่จะเรียกใช้โปรแกรมของฉันผ่าน
โรมัน

1
อีกทางเลือกหนึ่งคือการใช้อ็อพชัน -e โดยไม่จำเป็นต้องแยกไฟล์ jar cfe app.jar MainClass *.classหมายเหตุ: -e ถูกเพิ่มใน JDK 6
หลอก

35
  1. ตั้งค่า classpath และคอมไพล์

    javac -classpath "C: \ Program Files \ Java \ jdk1.6.0_ updateVersion \ tools.jar" yourApp.java

  2. สร้าง manifest.txt

    Main-Class: yourApp newline

  3. สร้าง app.jar ของคุณ

    jar cvf0m yourApp.jar manifest.txt yourApp.class

  4. เรียกใช้ app.jar ของคุณ

    java -jar yourApp.jar


9

คุณสามารถวิ่งด้วย:

java -cp .;app.jar package.MainClass

มันใช้ได้สำหรับฉันถ้าไม่มีรายการในไฟล์ JAR


ฉัน: ตัวเลือกที่ไม่รู้จัก: -cp คุณช่วยตรวจสอบคำตอบของคุณได้ไหม เพราะฉันไม่รู้ว่าคำสั่งนี้พยายามทำอะไร (java -cp.; app.jar package.MainClass) นี่คือหนึ่งคำสั่งหรือสองคำสั่ง?
kenorb

1
docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/… "-cp .; app.jar" ควรเพิ่มไฟล์ app.jar ของคุณในพา ธ คลาสกว่าที่คุณจะสามารถเรียกใช้ MainClass.main () วิธีการ ( MainClass อยู่ในแพ็คเกจ "package")
Dainius

1
ดังนั้นบน Linux อาจไม่มีตัวเลือกนี้ (-cp) (ของฉันคือ java v1.6.0_24, OpenJDK Runtime Environment (IcedTea6 1.11.3) (6b24-1.11.3-1ubuntu0.12.04.1))
kenorb

java -version => Java HotSpot (TM) 64-Bit Server VM (build 20.1-b02, mixed mode) "java -cp. test1.Main" ใช้ได้
Dainius

/ usr / lib / jvm / java-6-openjdk-amd64 / bin / java -version => OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode) "/ usr / lib / jvm / java-6-openjdk -amd64 / bin / java -cp. test1.Main "ทำงาน
Dainius

6

ฉันได้รับข้อผิดพลาดนี้และเป็นเพราะฉันมีอาร์กิวเมนต์ผิดลำดับ:

แก้ไข

java maui.main.Examples tagging -jar maui-1.0.jar 

ไม่ถูกต้อง

java -jar maui-1.0.jar maui.main.Examples tagging 

1
นี่อาจเป็นเพียงปัญหา bsd ฉันค่อนข้างมั่นใจว่าฉันได้ทำวิธีอื่นเมื่อเร็ว ๆ นี้
Sridhar Sarnobat

1

วิธีที่ง่ายที่สุดในการตรวจสอบให้แน่ใจว่าคุณได้สร้างไฟล์ JAR ที่รันได้อย่างถูกต้องด้วยไฟล์ manifest ที่เหมาะสมคือการใช้Eclipseเพื่อสร้างไฟล์ให้คุณ ในโปรเจ็กต์ Eclipse ของคุณโดยพื้นฐานแล้วคุณเพียงแค่เลือกไฟล์ / ส่งออกจากเมนูและทำตามคำแนะนำ

ด้วยวิธีนี้คุณจะมั่นใจได้ว่าไฟล์ JAR ของคุณถูกต้องและจะรู้ว่าต้องดูที่อื่นหากยังมีปัญหาอยู่ กระบวนการนี้อธิบายไว้อย่างครบถ้วนในคำถามที่พบบ่อยฉันจะสร้างไฟล์ JAR ที่ปฏิบัติการได้สำหรับโปรแกรม SWT แบบสแตนด์อะโลนได้อย่างไร .


ขอบคุณสำหรับExportEclipse IDE
Ninh Pham


0

ฉันพบว่าฉันมีข้อผิดพลาดนี้ใน NetBeans ฉันหวังว่าข้อมูลต่อไปนี้จะเป็นประโยชน์

  1. ตรวจสอบให้แน่ใจว่าเมื่อคุณไปที่การกำหนดค่าโครงการคุณได้ตั้งค่าคลาสหลักที่คุณต้องการเรียกใช้
  2. สร้าง Build หรือ Clean Build
  3. วางไฟล์ jar ที่คุณต้องการแล้วลอง: java -jar "YourProject.jar" อีกครั้งที่บรรทัดคำสั่ง

นี่เป็นปัญหาที่ฉันได้รับเนื่องจากฉันมีโปรแกรม "ทดสอบ" อื่น ๆ ที่ฉันใช้ใน NetBeans และฉันต้องตรวจสอบให้แน่ใจว่า Main Class ภายใต้ส่วน Run ของการกำหนดค่าโครงการได้รับการตั้งค่าอย่างถูกต้อง

พรมากมาย John P.


0

ฉันได้รับข้อผิดพลาดเดียวกันเมื่อฉันรัน:
jar cvfm test.jar Test.class Manifest.txt

สิ่งที่แก้ไขได้คือ:
jar cvfm test.jar Manifest.txt Test.class

ไฟล์ Manifest ของฉันมีจุดเริ่มต้นตามที่ระบุในเอกสาร oracle (ตรวจสอบให้แน่ใจว่ามีอักขระบรรทัดใหม่ที่ท้ายไฟล์):
Main-Class: Test


0

ฉันประสบปัญหาเดียวกัน คำสั่ง unix นี้ไม่สามารถค้นหาคลาสหลักได้ เนื่องจากรันไทม์และเวลาคอมไพล์เวอร์ชัน JDK แตกต่างกัน สร้าง jar ผ่าน eclipse หลังจากเปลี่ยนเวอร์ชันของคอมไพเลอร์ java ลิงค์ต่อไปนี้ช่วยฉัน

http://crunchify.com/exception-in-thread-main-java-lang-unsupportedclassversionerror-comcrunchifymain-unsupported-major-minor-version-51-0/

ลองเรียกใช้ jar ที่สร้างขึ้นหลังจากขั้นตอนนี้แล้วดำเนินการ


0

หากพา ธ คลาสของคุณถูกระบุไว้อย่างสมบูรณ์ในรายการบางทีคุณอาจต้องใช้สภาพแวดล้อมรันไทม์ java เวอร์ชันสุดท้าย ปัญหาของฉันได้รับการแก้ไขเมื่อฉันติดตั้ง jre 8 ใหม่


0

หากคุณใช้ eclipse ให้ลองด้านล่าง: 1. คลิกขวาที่โปรเจ็กต์ -> เลือกส่งออก 2. เลือกไฟล์ Runnable Jar ในเลือกปลายทางการส่งออก 3. ป้อนชื่อ jar และเลือก "Package required ... " (ปุ่มตัวเลือกที่สอง) -> เสร็จสิ้น

หวังว่านี่จะช่วยได้ ... !

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