2009-09-09 67 views
61

Khi tôi chạy dự án của tôi, tôi nhận được rất nhiều kết quả đầu ra của lỗi này:"NoClassDefFoundError: Không thể khởi tạo lớp" lỗi

 
Sep 9, 2009 8:22:23 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet Jersey threw exception 
java.lang.NoClassDefFoundError: Could not initialize class SpringFactory 
     at com.point2.prospect.persistence.hibernate.HibernateTransactionInterceptor.doFilter(HibernateTrans 
actionInterceptor.java:17) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at com.point2.prospect.restapi.ServerErrorInterceptor.doFilter(ServerErrorInterceptor.java:27) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
     at java.lang.Thread.run(Thread.java:619) 

Tôi nhận thấy rằng vấn đề này có một mẫu bị hỏi khắp nơi trên web, nhưng không có câu trả lời thực sự. Nguyên nhân chung cho loại lỗi này là gì?

Trả lời

6

Bạn đang thiếu định nghĩa lớp học cần thiết; thường được gây ra bởi JAR yêu cầu không được trong classpath.

Từ J2SE API:

public class NoClassDefFoundError extends LinkageError

Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.

The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.

+2

Tên thực tế của lớp bị thiếu phải nằm trong thư ngoại lệ lồng nhau ở đâu đó. –

171

lỗi NoClassDefFound là một lỗi mơ hồ và thường được che giấu một vấn đề nghiêm trọng hơn. Nó là không phải là giống như ClassNotFoundException (được ném khi lớp chỉ đơn giản là không có).

NoClassDefFound may cho biết lớp không có ở đó, như javadocs chỉ ra, nhưng thường được ném khi, sau khi trình nạp lớp đã tải byte cho lớp và gọi "defineClass" trên chúng. Cũng cẩn thận kiểm tra dấu vết ngăn xếp đầy đủ của bạn cho các đầu mối khác hoặc có thể "gây ra" ngoại lệ (mặc dù backtrace cụ thể của bạn cho thấy không có).

Nơi đầu tiên để xem khi nào bạn nhận được NoClassDefFoundError là trong các bit tĩnh của lớp của bạn tức là bất kỳ khởi tạo nào diễn ra trong quá trình xác định lớp. Nếu điều này không thành công nó sẽ ném một NoClassDefFoundError - nó phải ném một ExceptionInInitializerError và chỉ ra các chi tiết của vấn đề nhưng trong kinh nghiệm của tôi, đây là những hiếm. Nó sẽ chỉ thực hiện ExceptionInInitializerError lần đầu tiên nó cố định nghĩa lớp, sau đó nó sẽ ném NoClassDefFound. Vì vậy, nhìn vào các bản ghi trước đó.

Do đó, tôi sẽ đề xuất xem mã trong dòng HibernateTransactionInterceptor đó và xem nó đang yêu cầu gì. Dường như không thể xác định lớp SpringFactory. Vì vậy, có thể kiểm tra mã khởi tạo trong lớp đó, điều đó có thể hữu ích. Nếu bạn có thể gỡ lỗi, hãy dừng nó ở dòng cuối cùng ở trên (17) và gỡ lỗi để bạn có thể thử tìm đường chính xác đang gây ra ngoại lệ. Ngoài ra kiểm tra cao hơn trong nhật ký, nếu bạn rất may mắn có thể có một ExceptionInInitializerError.

+20

Cảm ơn bạn. Chuyển sự chú ý của tôi sang các khối khởi tạo tĩnh đã tiết kiệm được giờ tăng nặng. –

+1

"tức là bất kỳ sự khởi đầu nào diễn ra trong quá trình xác định lớp học" - Cảm ơn bạn! –

+2

Một ý tưởng hay khác là đăng nhập vào nhật ký của bạn vào một tập tin và tìm kiếm java.lang.ClassNotFoundException. Có thể có một trong những đi lạc của những người ở đó, mà sẽ cho bạn biết những gì lớp nó đã cố gắng để tải mà sản xuất tất cả các trường hợp ngoại lệ NoClassDefFoundError. Đã làm cho tôi. –

0

Tôi đã phải đối mặt với cùng một vấn đề, vì thư viện jar được sao chép bởi người dùng Linux khác (root) và người dùng đã đăng nhập (quá trình) không có đủ đặc quyền để đọc nội dung tệp jar.

0

Nhận ra rằng tôi đã sử dụng OpenJDK khi tôi thấy lỗi này. Đã sửa lỗi khi tôi cài đặt Oracle JDK.

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