2013-03-08 24 views
5

Tôi gặp phải lỗi khi chạy một số mã java nhất định liên quan đến JMS. Tôi đã kéo tóc của tôi ra trong 2 ngày cố gắng tìm ra điều này.NoClassDefFoundError javax/jms/Thông báo ngay cả khi chỉ định đường dẫn lớp

Ngoại lệ tôi nhận được là "java.lang.NoClassDefFoundError: javax/jms/Message"

java.lang.NoClassDefFoundError: javax/jms/Message 
    at Asci.ActiveBatch.JMSAgent.JMSManager.createMsg(JMSManager.java:195) 
    at Asci.ActiveBatch.JMSAgent.JMSService.SendMessageHandler(JMSService.java:160) 

Mà không đi sâu vào chi tiết quá nhiều, điều này được đề cập đến dòng này:

public static void createMsg(String icf, String url, String cf, String QName, String msgText, String[] props, String user, String pass) throws Exception { 
    JMSProducer.produceMsg(icf, url, cf, QName, msgText, props, user, pass); 
} 

(Đừng hỏi tại sao chức năng đó chỉ là bản đồ cơ bản với một chức năng khác ... Tôi không viết mã này ban đầu)

Tôi gọi mã này là

java -jar /path/myjarfile.jar 

javax.jms.jar được bao gồm trong tệp kê khai của jar đó (và nó tồn tại ở vị trí đó), nhưng trong trường hợp tôi cũng đã thử bao gồm cả classpath vào thư mục lib của tôi (chứa javax.jms.jar , tất nhiên) như sau:

java -classpath /path/lib:. -jar /path/myjarfile.jar 

Tôi đã không có may mắn cho đến nay. Tôi không chắc chắn phải làm gì hoặc làm thế nào để gỡ lỗi vấn đề này. Mọi sự trợ giúp sẽ rất được trân trọng. Rõ ràng, mã này biên dịch, vì vậy các lớp này phải có sẵn (ít nhất) trong thời gian biên dịch.

Cảm ơn.

CHỈNH SỬA:

1) Tôi cũng đã thử java -classpath /path/lib/javax.jms.jar :. -jar /path/myjarfile.jar

2) Sự cố này xảy ra trong thời gian chạy, không biên dịch.

3) Vì vậy, tôi có mã khác gọi cùng một phương thức trong cùng một tệp jar hoạt động. Có cái gì đó không chia lưới ngay khi gọi mã này từ một cái bình cụ thể. Tôi đã kiểm tra và kiểm tra lại mã khác của mình để chắc chắn rằng nó giống hệt nhau (mà nó là/là), do đó, nó không có vẻ giống như một vấn đề mã. Dường như có một số tham chiếu sai lầm hay gì đó, ở đâu đó.

+0

Bạn đã thử java -classpath /path/lib/javax.jms.jar :. -jar /path/myjarfile.jar? –

+0

Tôi không thực sự hiểu những gì JMS, nhưng tôi biết rằng một 'NoClassDefFound'-Exeption thường có nghĩa là, rằng một cái gì đó đã được tìm thấy tại thời gian biên dịch, nhưng không phải lúc chạy. – sschrass

+0

@ToddMurray Có, tôi đã thử xác định rõ ràng bình. – bdzevel

Trả lời

0

Khi thêm một .jar vào classpath, bạn cần phải tham khảo các jar trực tiếp, không phải là thư mục nó trong.

java -classpath /path/lib/JMS.jar:. -jar /path/myjarfile.jar 
+0

Ồ vâng, xin lỗi vì thông tin sai lạc. Tôi thực sự đã cố gắng làm điều này ..... java -classpath /path/lib/javax.jms.jar :. -jar /path/myjarfile.jar – bdzevel

4

Có thể là bạn đang có một cuộc xung đột classloader nơi một phiên bản của javax. jms.Message được tải trong một trình nạp lớp, và sau đó nó là những người đứng đầu với một phiên bản khác nhau được tải từ một trình nạp lớp khác nhau.

Bạn có thể thêm bộ khởi tạo tĩnh vào JMSManager và JMSProducer để làm điều gì đó như thế này không?

static { 
    System.out.println("MESSAGE CLASSLOADER IN JMSMANAGER:" + 
     javax.jms.Message.class.getProtectionDomain().getCodeSource().getLocation()); 
} 

Nếu chúng in ra các URL khác nhau, có nghĩa là bạn có nhiều bản sao javax/jms/Message.class trong đường dẫn lớp và hai người JMS đang tải các bản sao khác nhau.

Nếu không ..... tốt, đăng những gì bạn nhìn thấy :)

+0

OK Tôi đã thêm bộ khởi tạo tĩnh cho các lớp đang được đề cập đến. Tôi đã không thể nhận được bất kỳ đầu ra từ JMSManager hoặc JMSProducer, tuy nhiên, lớp tiếp theo lên (nơi mà những thứ này được gọi từ) được gọi là "JMSService." Tôi đã thêm bộ khởi tạo tĩnh cho lớp đó và bây giờ tôi nhận được một lỗi như sau: Gây ra bởi: java.lang.NoClassDefFoundError: javax/jms/Message tại Asci.ActiveBatch.JMSAgent.JMSService. (JMSService.java:34) tại sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Phương pháp Gốc) – bdzevel

+0

Bạn đang thiếu một tài nguyên khác. Biên dịch Asci.ActiveBatch.JMSAgent.JMSService và xem xét các phụ thuộc của nó. Bạn sẽ cần phải tìm lọ cho những người. –

+0

Nhưng ... Tôi thấy Message.class trong javax.jms.jar ... – bdzevel

0

Tạo một thư mục lib bên trong WEB-INF nếu nó không phải là có rồi.Đặt bình này: javax.jms.jar và khởi động lại máy chủ

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