Bagaimana cara menggunakan kelas dari file .jar?

135

Saya membaca tutorial Java tentang Sun untuk file JAR, tetapi saya masih tidak dapat menemukan solusi untuk masalah saya. Saya perlu menggunakan kelas dari file jar bernama jtwitter.jar, saya mengunduh file tersebut, dan mencoba menjalankannya (saya menemukan kemarin bahwa file .jar dapat dijalankan dengan mengklik dua kali pada mereka) dan Vista memberi saya kesalahan yang mengatakan " Gagal memuat atribut Manifes Kelas Utama dari [path] /jtwitter.jar ".

Orang yang membuat kode file .jar ingin saya mengimpornya, tetapi di mana saya menyimpan file .jar untuk mengimpornya ke dalam kode saya? Saya mencoba meletakkan file .jar dan file .java saya di direktori yang sama, tidak berhasil.

File yang saya coba kerjakan ada di sini: http://www.winterwell.com/software/jtwitter.php

Saya menggunakan JCreator LE.

Gaurav Dadhania
sumber
13
Mengapa ada suara negatif? Menurut saya, ini pertanyaan yang bagus dan ada informasi menarik di jawabannya! (+1)
guerda

Jawaban:

34

Tidak semua file jar dapat dieksekusi.

Sekarang, Anda perlu mengimpor kelas, yang ada di bawah jar, di file java Anda. Sebagai contoh,

import org.xml.sax.SAXException;

Jika Anda mengerjakan IDE, Anda harus merujuk dokumentasinya. Atau setidaknya tentukan mana yang Anda gunakan di sini di utas ini. Ini pasti akan memungkinkan kami untuk membantu Anda lebih jauh.

Dan jika Anda tidak menggunakan IDE apa pun, silakan lihat opsi javac -cp . Namun, itu ide yang jauh lebih baik untuk mengemas program Anda dalam sebuah jarfile, dan menyertakan semua yang diperlukan jardi dalamnya. Kemudian, untuk mengeksekusi jar, seperti,

java -jar my_program.jar

Anda harus memiliki META-INF/MANIFEST.MFfile di jar. Lihat di sini , untuk mengetahui caranya.

Adeel Ansari
sumber
tua, saya tahu, tetapi sebenarnya tidak perlu importapa-apa - ini hanya menghindari keharusan menulis nama kelas yang sepenuhnya memenuhi syarat siapa pun yang pernah kelas tersebut digunakan, hanya mengizinkan nama kelas sederhana ( SAXException) - semacam hanya mengimpor namespace
user85421
174

Katakanlah kita perlu menggunakan kelas Classnameyang terdapat dalam file jarorg.example.jar

Dan sumber Anda ada di file mysource.javaSeperti ini:

import org.example.Classname;

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

Pertama, seperti yang Anda lihat, dalam kode Anda, Anda harus mengimpor kelas. Untuk melakukan itu yang Anda butuhkanimport org.example.Classname;

Kedua, saat Anda mengompilasi sumber, Anda harus mereferensikan file jar.

Harap perhatikan perbedaan dalam menggunakan :dan ;saat menyusun

  • Jika Anda menggunakan sistem operasi mirip unix:

    javac -cp '.:org.example.jar' mysource.java
    
  • Jika Anda berada di bawah jendela:

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

Setelah ini, Anda mendapatkan file bytecode mysource.class

Sekarang Anda dapat menjalankan ini:

  • Jika Anda menggunakan sistem operasi mirip unix:

    java -cp '.:org.example.jar' mysource
    
  • Jika Anda berada di bawah jendela:

    java -cp .;org.example.jar mysource
    
GabrieleV
sumber
4
Bisakah Anda menjelaskan lebih banyak tentang notasi ini? Ini memperbaiki masalah saya, tetapi sayangnya saya TIDAK ADA IDEA apa arti titik koma / titik dua dalam kasus khusus ini.
kuburan
2
Cerita titik koma / titik dua ini baru saja saya bayar sehari penuh. Setidaknya saya menemukannya sekarang, terima kasih!
Maxim Zubarev
1
@ChaseMeadors Titik koma / titik dua pada dasarnya berarti "dan" di sini. Itu memisahkan .dari org.example.jar.
duozmo
Jika Anda membaca sekilas, perhatikan perbedaan dari sebagian besar *PATHvariabel: file .jar harus diberi nama satu per satu .
duozmo
15

Anda perlu menambahkan file jar di classpath. Untuk mengkompilasi kelas java Anda:

javac -cp .;jwitter.jar MyClass.java

Untuk menjalankan kode Anda (asalkan MyClass berisi metode utama):

java -cp .;jwitter.jar MyClass

Anda dapat memiliki file jar di mana saja. Cara di atas berfungsi jika file jar ada di direktori yang sama dengan file java Anda.

kgiannakakis
sumber
7

Anda perlu meletakkan file .jar ke classpath Anda saat mengompilasi / menjalankan kode Anda. Kemudian Anda cukup menggunakan impor standar kelas di .jar.

workmad3
sumber
6

Seperti yang dikatakan workmad3, Anda perlu file jar berada di jalur kelas Anda. Jika Anda mengompilasi dari commandline, itu berarti menggunakan flag -classpath. (Hindari variabel lingkungan CLASSPATH; itu menyakitkan di leher IMO.)

Jika Anda menggunakan IDE, beri tahu kami yang mana dan kami dapat membantu Anda dengan langkah-langkah khusus untuk IDE tersebut.

Jon Skeet
sumber
Variabel classpath env berguna jika Anda menggunakan skrip atau sesuatu seperti firedaemon untuk menjalankan aplikasi Anda. Hanya merepotkan jika Anda menggunakannya secara global :)
workmad3
Saya masih suka melihatnya secara eksplisit.
Jon Skeet
Saya setuju, saya suka melihatnya secara eksplisit.
J3r3myK