2008-11-28 29 views
43

Tôi sử dụng Eclipse (3.4) và lớp của tôi biên dịch mà không có cảnh báo hoặc lỗi. Dự án của tôi sử dụng tệp jar bên ngoài.Nơi để đặt các lọ bên ngoài?

Tôi cần đặt tệp jar bên ngoài này ở đâu để không nhận được java.lang.NoClassDefFoundError khi sử dụng lớp này từ một dự án khác (không phải trong Eclipse)?

Tôi chỉ có thể trích xuất lọ vào thư mục dự án, nhưng điều đó không cảm thấy đúng.

Chỉnh sửa: câu hỏi này không phải là về cách nhập các lọ trong Eclipse, nhưng sử dụng chúng ngoài Eclipse.

Trả lời

54

Nếu bạn muốn đưa tệp JAR vào dự án Eclipse của mình, bạn thường sẽ tạo thư mục 'lib' bên trong thư mục dự án và đặt tệp đó vào đó. Sau đó bạn cần phải nói nhật thực để bao gồm nó trong đường dẫn lớp của bạn để mã của bạn sẽ biên dịch và chạy bên trong nhật thực.

Để làm điều đó:
- Đi vào các tính chất của dự án của bạn
- Chọn 'Java Build Path' trong tay trái cột
- Chọn tab 'Libraries' ở phần trung tâm của cửa sổ
- Nhấn nút Add JARs - điều này sẽ cung cấp cho bạn một danh sách các dự án của bạn trong nhật thực - mở rộng dự án của bạn và vào thư mục lib - jar của bạn sẽ ở đó.
- Chọn JAR, nhấp OK và OK lần nữa trong cửa sổ thuộc tính.

Mã của bạn bây giờ sẽ biên dịch và chạy.

+2

Mã không biên dịch bên trong nhật thực. Khi chạy nó bên ngoài nhật thực (tức là một GUI khác gọi một hàm bên trong jar), tôi nhận được NoClassDefFoundError. – Burkhard

+1

Hoặc, bạn có thể chỉ cần nhấp chuột phải vào bình và bấm BuildPath-> Add to Build Path. –

+0

Khi bạn chạy bất kỳ thứ gì ngoài nhật thực, bạn phải cung cấp các tệp nhị phân của dự án nhật thực (nếu không được xây dựng vào một cái lọ) trong đường dẫn lớp của bất cứ thứ gì bạn đang chạy. –

7

Không quan trọng bạn đặt nó ở đâu, nhưng bạn cần định cấu hình dự án không phải Eclipse của bạn để đặt các jars bên ngoài vào đường dẫn lớp của nó - hoặc sử dụng cơ chế thư mục tiện ích mở rộng, nếu bạn phải. (Đó là dễ dàng hơn, nhưng làm cho nó rõ ràng là cho là tốt hơn.)

+0

Dự án không phải Eclipse không được cấu hình và cũng không được tôi duy trì. Trong thực tế, tôi chỉ viết một vài lớp và một trong các lớp này sử dụng một lớp khác từ tệp jar. – Burkhard

+0

Vì vậy, bạn không thể cấu hình dự án khác * ở tất cả * về classpath? Sớm hay muộn, đó là ràng buộc để cắn bạn. Thay vì làm việc xung quanh hạn chế đó, hãy cố gắng khắc phục nó. –

0

Tôi đặt nó vào một thư mục mới. Thư mục này phải được đưa vào đường dẫn xây dựng. Nó không quan trọng nếu nó ở trong Eclipse hoặc bên ngoài. Eclipse có một đường dẫn xây dựng dự án cụ thể và nó chuyển đường dẫn này đến javac. Nếu bạn muốn thực thi javac bên ngoài Eclipse, bạn phải chuyển đường dẫn xây dựng theo cách thủ công.

1

Bạn chỉ cần tham khảo nó bằng cách sử dụng tùy chọn -classpath, trong một thư mục không được bao gồm trong không gian làm việc nhật thực, tức là không phụ thuộc vào nhật thực.

Cảnh báo, bạn cannoy thực hiện dự án khác của bạn với java -jar nếu bạn tham khảo jar bên ngoài của bạn với -cp tùy chọn (see this question)

19

đặt nó trong thư mục jre/lib/ext bạn

mọi thứ nói về classpath là đúng, nhưng điều này là nơi phù hợp và hợp lý để sống.

bạn có thể tìm thấy thư mục jre của mình bằng cách xem biến môi trường JAVA_HOME trên Windows.

+0

Thú vị, nhưng tôi có ba JRE và ba JDK trên máy tính của mình, tôi không thấy bản thân mình cũng sao chép tất cả các thư viện tôi cần. – PhiLho

+1

bạn có thể có ba (tôi cũng vậy), nhưng bạn chỉ sử dụng một tài khoản bất kỳ lúc nào, được xác định bởi JAVA_HOME của bạn. Ngoài ra công cụ của bên thứ 3 của bạn có thể có các phiên bản khác nhau cho các JRE khác nhau, do đó bạn có nghịch đảo của vấn đề trùng lặp nếu bạn không thực hiện phương pháp này. Đó là những gì jre/lib/ext là cho. – Simon

+0

Trong ngắn hạn đủ hữu ích. – asifaftab87

0

Tôi biết điều này không chính xác những gì bạn đang yêu cầu, nhưng bạn đã cân nhắc sử dụng Maven chưa? Một số plugin như assembly có thể hữu ích trong các tình huống như thế này.

0

Có một cái bình bên trong Eclipse, như James Camfield đã viết.

Sau đó, khi bạn xây dựng (Ant, Maven, thủ công) để phân phối, hãy đảm bảo tệp jar được bao gồm trong hoặc trong jar ứng dụng hoặc chiến tranh hoặc tai hoặc bất kỳ tệp nào và mọi tập lệnh khởi động bao gồm nó trên đường dẫn lớp bằng cách sử dụng tùy chọn dòng lệnh-classpath cho java, như VonC đã viết.

Đừng lo lắng về việc dán các lọ trong thư mục tiện ích mở rộng java, tất cả điều này sẽ khiến bạn quên nó khi gửi mã của bạn cho bên thứ ba để sử dụng, vì chúng sẽ không được đặt lên ở cuối của họ.

0

Tạo thư mục lib được chia sẻ và đặt bình này và bất kỳ tệp tin bình thường nào khác mà bạn có thể có ở đó. Nếu bạn đang sử dụng Maven, thì bạn đã có nó ở dạng repo cục bộ.

Trong Eclipse, tạo biến classpath cho thư mục này và sau đó sử dụng nó để tham chiếu tệp jar của bạn trong các dự án của bạn. Nếu bạn có nhiều dự án đáp ứng các điều kiện này, nó sẽ làm cho cuộc sống dễ dàng hơn nhiều. Nó cũng làm cho nó dễ dàng để thay đổi vị trí của thư mục gốc nếu bạn đi từ một ổ đĩa cục bộ đến một mạng.

Trong ứng dụng bên ngoài, bạn cũng sẽ bao gồm tệp jar này từ vị trí được chia sẻ của nó trên đường dẫn ứng dụng.

5

Câu trả lời của Simon có vẻ là tốt nhất nhưng hơi lỗi thời. Đã googled tài liệu Oracle này Installed extensions.

Vì Java 6, tệp JAR mở rộng cũng có thể được đặt ở một vị trí độc lập với bất kỳ JRE cụ thể nào, để các tiện ích có thể được chia sẻ bởi tất cả các JRE được cài đặt trên hệ thống.

Nó nói rằng đối với Windows, bạn nên đặt các tiện ích mở rộng của mình ở đây% SystemRoot% \ Sun \ Java \ lib \ ext.

Các vấn đề liên quan