2010-07-12 32 views
12

Tôi đang cố gắng chạy một ứng dụng mẫu từ HttpClient 4.0.1. Đây là tệp ClientMultiThreadedExecution.java từ phần ví dụ. Tôi đặt các tệp này vào đường dẫn lớp: apache-mime4j-0.6.jar; commons-codec-1.3.jar; commons-logging-1.1.1.jar; httpclient-4.0.1.jar; httpcore-4.0.1.jar; httpmime-4.0.1.jar và tệp sẽ biên dịch chính xác. Khi chạy, tôi nhận được lỗi sau:HttpClient NoClassDefFoundError

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpUriRequest 
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.methods.HttpUriRequest 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) 

Tôi có thiếu tham chiếu không? Nó có vẻ như một lỗi classpath nhưng tôi không thể tìm ra tập tin jar để bao gồm? Cảm ơn rất nhiều về sự trợ giúp của bạn.

Trả lời

5

Ngoại lệ này cho biết rằng lớp được đề cập bị thiếu trong đường dẫn lớp học thời gian chạy.

Có một số cách để chỉ định đường dẫn lớp thời gian chạy, tùy thuộc vào cách bạn đang thực thi chương trình. Kể từ khi một IDE phong nha này có tất cả trong suốt từ bàn tay của bạn, tôi đặt cược rằng bạn đang chạy nó trong một dấu nhắc lệnh.

Nếu bạn đang chạy tệp dưới dạng tệp JAR bằng cách java.exe -jar hoặc tăng gấp đôi tệp, thì bạn cần chỉ định đường dẫn lớp trong mục nhập Class-Path của tệp MANIFEST.MF của JAR. Lưu ý rằng biến môi trường %CLASSPATH% và các đối số -cp-classpathbỏ qua bất cứ khi nào bạn thực hiện JAR.

Nếu bạn đang chạy ứng dụng Java dưới dạng ứng dụng Java "thuần tuý" theo java.exe, thì bạn cần chỉ định nó trong đối số -cp hoặc -classpath. Lưu ý rằng bất cứ khi nào bạn sử dụng đối số này, biến môi trường %CLASSPATH%bị bỏ qua.

Dù bằng cách nào, đường dẫn lớp phải tồn tại một chuỗi đường dẫn (bán) colonseparated tới tệp JAR (đường dẫn tuyệt đối hoặc tương đối với thư mục làm việc hiện tại). Ví dụ.

java -cp .;/path/to/file1.jar;/path/to/file2.jar com.example.MyClass

(nếu bạn đang ở trên Unix/Linux, sử dụng thư đại tràng thay vì dấu chấm phẩy như con đường tách)

5

Lớp học đó nằm trong httpclient-4.0.1.jar (tôi vừa tải xuống để chắc chắn) vì vậy tôi nghi ngờ bạn chưa đặt nó trong classpath đúng cách.

Bạn đang biên dịch và chạy mã của mình như thế nào?

+0

Sử dụng Textpad. Nó nằm trong cùng thư mục với các tệp JAR và tôi có nó trong cấu hình $ File -cp.; Apache-mime4j-0.6.jar; commons-codec-1.3.jar; commons-logging-1.1.1.jar; httpclient-4.0.1.jar; httpcore-4.0.1.jar; httpmime-4.0.1.jar Nó biên dịch tốt nhưng không chạy. – user389753

-1

Với maven này có thể được thực hiện thông qua phạm vi nhập khẩu.

0

Khi tôi gặp sự cố này, hóa ra là khi tôi thêm API Fluent làm phụ thuộc Maven, nó đã nhập một phiên bản API HTTPClient khác với phiên bản tôi đã sử dụng. Cả hai phiên bản của API được đóng gói trong thư mục lib của JAR. Xung đột phiên bản là nguyên nhân gây ra lỗi này.

Thêm mục nhập vào đường dẫn lớp học của bạn sẽ khắc phục sự cố, vì bạn chỉ định rõ phiên bản nào sẽ sử dụng theo cách thủ công. Tuy nhiên, để khắc phục vấn đề cơ bản, tôi chỉ cần xóa thư mục đích của mình trước khi xây dựng lại (hoặc chạy maven clean). Thao tác này đã xóa mọi tệp JAR thư viện "được lưu trong bộ nhớ cache" và trên bản dựng tiếp theo, chỉ được tải xuống lại một tệp chính xác.

Hy vọng rằng sẽ giúp ai đó!

1

Chạy Eclipse Luna 2 (4.4.2) bên trong cloudera-quickstart-vm-5.8.0 Tôi đã có thêm những điều sau

  • apache-httpcomponents-httpcore.jar
  • httpclient-4.5.3.jar
  • httpclient-cache-4.5.3.jar

.. và sau đó nó hoạt động mà không có lỗi

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