Làm thế nào để sử dụng các lớp từ các tập tin .jar?


134

Tôi đã đọc các hướng dẫn Java trên Sun cho các tệp JAR, nhưng tôi vẫn không thể tìm ra giải pháp cho vấn đề của mình. Tôi cần sử dụng một lớp từ tệp jar có tên là jtwitter.jar, tôi đã tải xuống tệp và thử thực thi nó (tôi phát hiện ra ngày hôm qua rằng các tệp .jar có thể được thực thi bằng cách nhấp đúp vào chúng) và Vista đã báo lỗi cho tôi " Không thể tải thuộc tính Manifest Main-Class từ [path] /jtwitter.jar ".

Anh chàng đã mã hóa tệp .jar muốn tôi nhập nó, nhưng tôi sẽ lưu tệp .jar ở đâu để nhập nó trong mã của mình? Tôi đã thử đặt cả tệp .jar và tệp .java của mình vào cùng một thư mục, không hoạt động.

Tệp tôi đang cố gắng làm việc ở đây: http://www.winterwell.com/software/jtwitter.php

Tôi đang sử dụng JCreator LE.


13
Tại sao có downvote? Theo tôi, đó là một câu hỏi hay và có nhiều thông tin thú vị trong câu trả lời! (+1)
guerda

Câu trả lời:


34

Không phải mọi tập tin jar là thực thi.

Bây giờ, bạn cần nhập các lớp có trong tệp jar trong tệp java của bạn. Ví dụ,

import org.xml.sax.SAXException;

Nếu bạn đang làm việc trên một IDE, thì bạn nên tham khảo tài liệu của nó. Hoặc ít nhất chỉ định cái nào bạn đang sử dụng ở đây trong chuỗi này. Nó chắc chắn sẽ cho phép chúng tôi giúp bạn hơn nữa.

Và nếu bạn không sử dụng bất kỳ IDE nào, thì hãy xem javac -cp tùy chọn . Tuy nhiên, tốt hơn hết là bạn nên đóng gói chương trình của mình trong một jartệp và bao gồm tất cả các yêu cầu jartrong đó. Sau đó, để thực hiện jar, như,

java -jar my_program.jar

bạn nên có một META-INF/MANIFEST.MFtập tin trong bạn jar. Xem ở đây , để biết cách làm.


Tôi biết, nhưng tôi thực sự không cần importbất cứ điều gì - nó chỉ cần tránh phải viết tên lớp đủ điều kiện từng sử dụng lớp, chỉ cho phép tên lớp đơn giản ( SAXException) - loại chỉ nhập không gian tên
user85421

173

Giả sử chúng ta cần sử dụng lớp Classnamecó trong tệp jarorg.example.jar

Và nguồn của bạn nằm trong tệp mysource.javaNhư thế này:

import org.example.Classname;

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

Đầu tiên, như bạn thấy, trong mã của bạn, bạn phải nhập các lớp. Để làm điều đó bạn cầnimport org.example.Classname;

Thứ hai, khi bạn biên dịch nguồn, bạn phải tham chiếu tệp jar.

Xin lưu ý sự khác biệt trong việc sử dụng :;trong khi biên dịch

  • Nếu bạn đang ở dưới một hệ thống unix như hệ điều hành:

    javac -cp '.:org.example.jar' mysource.java
  • Nếu bạn đang ở dưới cửa sổ:

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

Sau này, bạn có được tệp mã byte mysource.class

Bây giờ bạn có thể chạy này:

  • Nếu bạn đang ở dưới một hệ thống unix như hệ điều hành:

    java -cp '.:org.example.jar' mysource
  • Nếu bạn đang ở dưới cửa sổ:

    java -cp .;org.example.jar mysource

4
Bạn có thể giải thích ký hiệu này nhiều hơn một chút? Điều này đã khắc phục vấn đề của tôi, nhưng thật không may, tôi không có IDEA, dấu chấm phẩy / dấu hai chấm có nghĩa gì trong trường hợp cụ thể này.
hỏa táng

2
Câu chuyện dấu chấm phẩy / đại tràng này chỉ khiến tôi mất cả ngày. Ít nhất tôi đã tìm thấy nó bây giờ, cảm ơn!
Maxim Zubarev

1
@ChaseMeadors Dấu chấm phẩy / dấu hai chấm có nghĩa là "và" ở đây. Nó đang tách .ra org.example.jar.
duozmo

Nếu bạn đang lướt qua, hãy chú ý đến hầu hết *PATHcác biến: các tệp .jar cần được đặt tên riêng .
duozmo

15

Bạn cần thêm tệp jar trong đường dẫn lớp. Để biên dịch lớp java của bạn:

javac -cp .;jwitter.jar MyClass.java

Để chạy mã của bạn (với điều kiện MyClass chứa phương thức chính):

java -cp .;jwitter.jar MyClass

Bạn có thể có tập tin jar ở bất cứ đâu. Công việc trên nếu tệp jar nằm trong cùng thư mục với tệp java của bạn.


7

Bạn cần đặt tệp .jar vào đường dẫn lớp của bạn khi biên dịch / chạy mã của bạn. Sau đó, bạn chỉ cần sử dụng nhập khẩu tiêu chuẩn của các lớp trong .jar.


6

Như workmad3 nói, bạn cần tệp jar nằm trong đường dẫn lớp của bạn. Nếu bạn đang biên dịch từ dòng lệnh, điều đó có nghĩa là sử dụng cờ-classpath. (Tránh biến môi trường CLASSPATH; đó là một cơn đau ở cổ IMO.)

Nếu bạn đang sử dụng IDE, vui lòng cho chúng tôi biết cái nào và chúng tôi có thể giúp bạn các bước cụ thể cho IDE đó.


Biến enpath classpath rất hữu ích nếu bạn đang sử dụng các tập lệnh hoặc một cái gì đó như fireaemon để chạy ứng dụng của bạn. Nó chỉ là một nỗi đau khi bạn sử dụng nó trên toàn cầu :)
workmad3

Tôi vẫn muốn nhìn thấy nó rõ ràng.
Jon Skeet

Tôi đồng ý, tôi muốn nhìn thấy nó rõ ràng.
J3r3myK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.