จะใช้คลาสจากไฟล์. jar ได้อย่างไร?


135

ฉันอ่านบทแนะนำ Java เกี่ยวกับไฟล์ Sun for JAR แต่ฉันยังหาวิธีแก้ปัญหาไม่ได้ ฉันต้องใช้คลาสจากไฟล์ jar ที่ชื่อว่า jtwitter.jar ฉันดาวน์โหลดไฟล์และลองเรียกใช้งาน (ฉันพบเมื่อวานนี้ว่าไฟล์. jar สามารถเรียกใช้งานได้โดยการดับเบิลคลิกที่ไฟล์เหล่านั้น) และ Vista ให้ข้อผิดพลาดกับฉันว่า " ไม่สามารถโหลดแอตทริบิวต์ Manifest ระดับหลักจาก [path] /jtwitter.jar "

ผู้ชายที่เขียนโค้ดไฟล์. jar ต้องการให้ฉันนำเข้า แต่ฉันจะเก็บไฟล์. jar ไว้ที่ไหนเพื่อนำเข้าในโค้ดของฉัน? ฉันลองใส่ทั้งไฟล์. jar และไฟล์. java ในไดเร็กทอรีเดียวกันไม่ได้ผล

ไฟล์ที่ฉันพยายามใช้งานอยู่ที่นี่: http://www.winterwell.com/software/jtwitter.php

ฉันใช้ JCreator LE


13
ทำไมจึงมีการโหวตลง? ในความคิดของฉันมันเป็นคำถามที่ดีและมีข้อมูลที่น่าสนใจในคำตอบ! (+1)
guerda

คำตอบ:


34

ไม่ใช่ทุกไฟล์ jar ที่สามารถเรียกใช้งานได้

ตอนนี้คุณต้องนำเข้าคลาสซึ่งอยู่ภายใต้ jar ในไฟล์ java ของคุณ ตัวอย่างเช่น,

import org.xml.sax.SAXException;

หากคุณกำลังทำงานกับ IDE คุณควรอ้างอิงเอกสารประกอบ หรืออย่างน้อยระบุว่าคุณกำลังใช้อันไหนในเธรดนี้ แน่นอนว่าจะช่วยให้เราสามารถช่วยเหลือคุณได้มากขึ้น

และหากคุณไม่ได้ใช้ IDE ใด ๆ โปรดดูที่ตัวเลือกjavac -cp อย่างไรก็ตามเป็นความคิดที่ดีกว่ามากที่จะรวมโปรแกรมของคุณไว้ในjarไฟล์และรวมสิ่งที่จำเป็นทั้งหมดไว้jarภายในนั้น จากนั้นในการดำเนินการของคุณjarเช่น

java -jar my_program.jar

คุณควรมีMETA-INF/MANIFEST.MFไฟล์ในไฟล์jar. ดูที่นี่สำหรับวิธีการ


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

174

สมมติว่าเราต้องใช้คลาสClassnameที่มีอยู่ในไฟล์ jarorg.example.jar

และแหล่งที่มาของคุณอยู่ในไฟล์mysource.javaดังนี้:

import org.example.Classname;

public class mysource {
    public static void main(String[] argv) {
    ......
   }
}

อันดับแรกอย่างที่คุณเห็นในโค้ดของคุณคุณต้องนำเข้าคลาส ในการทำเช่นนั้นคุณต้องimport org.example.Classname;

ประการที่สองเมื่อคุณรวบรวมแหล่งที่มาคุณต้องอ้างอิงไฟล์ jar

โปรดสังเกตความแตกต่างในการใช้:และ;ขณะรวบรวม

  • หากคุณอยู่ภายใต้ระบบปฏิบัติการ unix like:

    javac -cp '.:org.example.jar' mysource.java
    
  • หากคุณอยู่ใต้หน้าต่าง:

    javac -cp .;org.example.jar mysource.java
    

หลังจากนี้คุณจะได้รับไฟล์ bytecode mysource.class

ตอนนี้คุณสามารถเรียกใช้สิ่งนี้:

  • หากคุณอยู่ภายใต้ระบบปฏิบัติการ unix like:

    java -cp '.:org.example.jar' mysource
    
  • หากคุณอยู่ใต้หน้าต่าง:

    java -cp .;org.example.jar mysource
    

4
คุณช่วยอธิบายสัญกรณ์นี้อีกหน่อยได้ไหม สิ่งนี้ช่วยแก้ปัญหาของฉันได้ แต่น่าเสียดายที่ฉันไม่มีความคิดว่าอัฒภาค / โคลอนหมายถึงอะไรในกรณีนี้
ฝังศพ

2
เรื่องอัฒภาค / โคลอนนี้ทำให้ฉันเสียเวลาทั้งวัน อย่างน้อยฉันก็พบแล้วขอบคุณ!
Maxim Zubarev

1
@ChaseMeadors อัฒภาค / โคลอนหมายถึง "และ" ที่นี่เป็นหลัก มันแยกจาก. org.example.jar
duozmo

หากคุณกำลัง skimming, ฟังความแตกต่างจากส่วนใหญ่*PATHตัวแปร: แฟ้มขวดจะต้องมีชื่อเป็นรายบุคคล
duozmo

15

คุณต้องเพิ่มไฟล์ jar ใน classpath ในการรวบรวมคลาส java ของคุณ:

javac -cp .;jwitter.jar MyClass.java

ในการรันโค้ดของคุณ (โดยมีเงื่อนไขว่า MyClass มีเมธอดหลัก):

java -cp .;jwitter.jar MyClass

คุณสามารถมีไฟล์ jar ได้ทุกที่ ข้างต้นใช้งานได้หากไฟล์ jar อยู่ในไดเร็กทอรีเดียวกับไฟล์ java ของคุณ


7

คุณต้องใส่ไฟล์. jar ลงใน classpath ของคุณเมื่อคอมไพล์ / รันโค้ดของคุณ จากนั้นคุณก็ใช้การนำเข้ามาตรฐานของคลาสใน. jar


6

ตามที่ workmad3 กล่าวไว้คุณต้องให้ไฟล์ jar อยู่ใน classpath ของคุณ หากคุณกำลังคอมไพล์จาก commandline นั่นจะหมายถึงการใช้แฟล็ก -classpath (หลีกเลี่ยงตัวแปรสภาพแวดล้อม CLASSPATH มันปวดคอ IMO)

หากคุณใช้ IDE โปรดแจ้งให้เราทราบว่า IDE ใดและเราสามารถช่วยคุณในขั้นตอนเฉพาะสำหรับ IDE นั้นได้


ตัวแปร classpath env มีประโยชน์หากคุณใช้สคริปต์หรืออะไรอย่างเช่นfireaemonเพื่อรันแอปของคุณ มันเป็นเพียงความเจ็บปวดเมื่อคุณใช้มันทั่วโลก :)
workmad3

ฉันยังชอบที่จะเห็นมันอย่างชัดเจน
Jon Skeet

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