เรียกใช้ไฟล์ JAR จากบรรทัดรับคำสั่งและระบุ classpath


115

ฉันได้รวบรวมไฟล์JARและระบุ Main-Class ในรายการ (ฉันใช้ฟังก์ชันEclipse Export ) libการอ้างอิงของฉันที่มีทั้งหมดในไดเรกทอรีที่ระบุว่า ดูเหมือนจะไม่ได้คำตอบที่ตรงเกี่ยวกับวิธีเรียกใช้ไฟล์ JAR ของฉันในขณะที่ระบุว่าควรใช้lib/*เป็น classpath

ฉันพยายามแล้ว:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main

ฯลฯ ...

แต่ละข้อให้ข้อผิดพลาดว่า:

Error: Could not find or load main class ....

หรือNoClassDefFoundErrorระบุว่าไม่พบไลบรารี

ฉันพยายามสร้างไฟล์ JAR ใหม่และรวมlibไดเร็กทอรีและเนื้อหา แต่ก็ยังไม่มีลูกเต๋า ...

ฉันจะเรียกใช้ไฟล์ JAR จากบรรทัดคำสั่งและระบุ classpath ที่จะใช้ได้อย่างไร


คำตอบ:


204

เมื่อคุณระบุ-jarแล้ว-cpพารามิเตอร์จะถูกละเว้น

จากเอกสารประกอบ :

เมื่อคุณใช้อ็อพชันนี้ไฟล์ JAR คือซอร์สของคลาสผู้ใช้ทั้งหมดและการตั้งค่าพา ธ คลาสผู้ใช้อื่น ๆ จะถูกละเว้น

คุณยังไม่สามารถ "รวม" ไฟล์ jar ที่จำเป็นลงในไฟล์ jar อื่นได้ (คุณจะต้องแตกเนื้อหาและใส่ไฟล์. class ลงในไฟล์ jar ของคุณ)

คุณมีสองทางเลือก:

  1. รวมไฟล์ jar ทั้งหมดจากlibไดเร็กทอรีลงในรายการ (คุณสามารถใช้พา ธ สัมพัทธ์ได้ที่นั่น)
  2. ระบุทุกอย่าง ( รวมถึง jar ของคุณ) ในบรรทัดคำสั่งโดยใช้-cp:
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

22
; แทน: ถ้าคุณใช้ windows ดังนี้ java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
ข้อผิดพลาด

คุณยังไม่สามารถ "รวม" ไฟล์ jar ที่จำเป็นลงในไฟล์ jar อื่นได้ แน่นอนว่าคุณทำได้ ถ้ามันสำหรับการใช้ภายใน (เช่นคุณคาดหวังว่าผู้ใช้มีทักษะทางเทคนิคบาง ฯลฯ ) คุณก็สามารถขอให้ขั้นตอนที่ 1 unzip MyJar.jar lib/*.jarก่อนที่จะพยายามที่จะเรียกใช้ขวดคือการวิ่ง จากนั้นตามที่คุณแนะนำพวกเขาสามารถวิ่งได้java -cp MyJar.jar:lib/* ...
Roger

3
คนเกียจคร้านคือกรณีการใช้งานทั่วไปในการเรียกใช้ jar uber แบบ "รวมทุกอย่าง" โดยอ้างอิงไปยังไฟล์คุณสมบัติเฉพาะเซิร์ฟเวอร์ภายนอก เห็นได้ชัดว่าไม่ใช่ตัวบล็อก แต่เป็นคำสั่ง verbose น้อยกว่าหากคุณสามารถใช้ -jar และไม่ต้องระบุ main
Andrew Norman

ใช้เวลาสักพักเพื่อคิดออก และใช้เวลาประมาณ 6 บรรทัดในการโหลดไฟล์ log4j อย่างชัดเจน ข้อบกพร่องอื่น ๆ ของ Java ที่จะไม่ได้รับการแก้ไข
Tuntable

1
โปรดทราบว่าพา ธ คลาสที่หลากหลายสามารถใช้สำหรับการโหลดไฟล์ jar เท่านั้น ไม่สามารถใช้เพื่อค้นหา log4j3.xml ตัวอย่างเช่น มีฉันที่ดี
Tuntable

34

เรียกใช้ไฟล์ jar และระบุคลาสพา ธ ดังนี้:

java -cp <jar_name.jar:libs/*> com.test.App

jar_name.jar คือชื่อเต็มของ JAR ที่คุณต้องการเรียกใช้งาน

libs/* เป็นเส้นทางไปยัง JAR การพึ่งพาของคุณ

com.test.App เป็นชื่อแบบเต็มของคลาสจาก JAR ที่มี main(String[])เมธอด

โถและโถที่ขึ้นกับกันควรมีสิทธิ์ดำเนินการ


10

คุณสามารถทำได้ใน unix shell:

java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

คุณสามารถทำได้ใน windows powershell:

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main

4

หรือใช้รายการเพื่อระบุคลาส - พา ธ และคลาสหลักถ้าคุณต้องการดังนั้นคุณไม่จำเป็นต้องใช้-cpหรือระบุคลาสหลัก ในกรณีของคุณจะมีบรรทัดดังนี้:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

น่าเสียดายที่คุณต้องสะกดแต่ละ jar ในรายการ (ไม่ใช่เรื่องใหญ่เหมือนที่คุณทำเพียงครั้งเดียวและคุณสามารถใช้สคริปต์เพื่อสร้างไฟล์หรือใช้เครื่องมือสร้างเช่น ANT หรือ Maven หรือ Gradle) และการอ้างอิงจะต้องเป็นไดเร็กทอรีสัมพัทธ์หรือแบบสัมบูรณ์ที่คุณรันไฟล์java -jar MyJar.jar .

จากนั้นดำเนินการด้วย

java -jar MyJar.jar

ฉันคิดว่า Class-Path จำเป็นต้องอ้างถึงไฟล์ภายใน jar ด้านนอก ฉันไม่สามารถทำให้สิ่งนี้ทำงานโดยทั่วไปเพื่ออ้างถึงไฟล์ config ภายนอก MyJar.jar
Tuntable

0

คุณสามารถทำ Runtime.getRuntime.exec (คำสั่ง) เพื่อเปิดใช้งาน jar ใหม่รวมถึง classpath ที่มี args

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