2012-03-02 27 views
6

Các phương pháp sau đây:java.rmi.ServerException: RemoteException xảy ra trong chủ đề máy chủ (ClassNotFoundException)

private void startServer() { // snippet that starts the server on the local machine 
    try { 
     RemoteMethodImpl impl = new RemoteMethodImpl(); 
     Naming.rebind("Illusive-Server" , impl); 
    }catch(Exception exc) { 
     JOptionPane.showMessageDialog(this, "Problem starting the server", "Error", JOptionPane.ERROR_MESSAGE); 
     System.out.println(exc); 
    } 
} 

ném ngoại lệ này: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: Interfaces.RemoteMethodIntf

Khi tôi bắt đầu dự án của tôi, tôi đang chào đón với thông điệp trong JOptionPane nói rằng vấn đề bắt đầu từ máy chủ và sau đó là ngoại lệ trên. Điều gì có thể là lý do cho điều này?

Tôi không hiểu tại sao báo cáo kết quả cuối cùng của ngoại lệ nói lớp không tìm thấy exc khi tôi đã nhập khẩu các gói đúng

Trả lời

11

Có ba trường hợp ngoại lệ này.

  1. Khi xuất khẩu: bạn không chạy 'rmic' và bạn đã không thực hiện các bước được mô tả trong phần mở đầu của Javadoc cho UnicastRemoteObject để làm cho nó không cần thiết.

  2. Khi liên kết: Registry không có sơ khai hoặc giao diện từ xa hoặc thứ gì đó mà chúng phụ thuộc vào đường dẫn lớp của nó.

  3. khi tra cứu: khách hàng không có những thứ này trên đường dẫn lớp.

Đây là trường hợp 2. Cơ quan đăng ký không thể tìm thấy lớp được đặt tên.

Có bốn giải pháp:

  1. Khởi động Registry với một CLASSPATH bao gồm các lọ hoặc thư mục có liên quan.

  2. Khởi động Registry trong JVM máy chủ của bạn, qua LocateRegistry.createRegistry().

  3. Sử dụng khai năng động, như được mô tả trong phần mở đầu của Javadoc của UnicastRemoteObject. Tuy nhiên bạn có thể sau đó vẫn chạy vào cùng một vấn đề với giao diện từ xa tự hoặc một lớp mà nó phụ thuộc vào, trong trường hợp 1-3 ở trên vẫn áp dụng cho lớp đó/các lớp đó.

  4. Sử dụng tính năng codebase. Điều này thực sự là một lựa chọn triển khai và IMO một cái gì đó để tránh ở giai đoạn phát triển ban đầu.

+0

Sự cố được giải quyết nhưng chúng tôi vẫn cần tệp sơ khai? –

+0

@SuhailGupta Xem phần mở đầu cho 'java.rmi.server.UnicastRemoteObject'. Bạn chỉ cần tạo một lớp sơ khai nếu bạn đang sử dụng Java <1.5 hoặc bạn không tuân thủ các nguyên tắc đó. Như bạn có ngoại lệ, rõ ràng một trong hai điều đó là đúng. – EJP

+0

Tôi đang sử dụng java> 1.5. Và lớp của tôi mở rộng UnicastRemoteObject. Tôi hơi lỗi thời. [Đây là mã nhỏ mà tôi đã sử dụng] (http://suhail03.my3gb.com/doubt.html) –

3
Remote Server Error:RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: mathInterface 

Các lỗi rất đơn giản để giải quyết được thực hiện các bước sau:

  • Ví dụ file java của bạn xem xét ổ đĩa D
  • Bắt đầu ổ rmiregistry D (ví dụ D: \ bắt đầu rmiregistry) sau đó không bắt đầu rmiregistry trên các ổ đĩa khác, nó sẽ mang lại các lỗi trên

(Bất cứ nơi nào bạn tập tin là, bắt đầu rmiregistry)

+0

wow, điều này thực sự làm việc cho tôi ... mặc dù tôi không biết tại sao? bất cứ ai có thể giải thích những gì đang xảy ra ở đây? – ultrajohn

+1

@ultrajohn Xem câu trả lời của tôi. Cái này hoạt động vì nó đặt lớp được yêu cầu trên CLASSPATH của Registry, nhưng chỉ khi lớp đó không có trong một gói. Nếu có, nó sẽ không hoạt động. -1 vì thiếu giải thích và giải pháp đặc biệt. – EJP

-1

Bạn có thể khởi động rmiregistry từ bất cứ đâu nhưng bạn phải đảm bảo rằng các lớp đã biên dịch đã có trong classpath của bạn. Ví dụ: -

E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes>set classpath=%classpath%;E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes <ENTER> 

E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes>c: <ENTER> 

C:\>rmiregistry 

Và điều trên sẽ hoạt động tốt.

Nói chung, nếu bạn khởi động rmiregistry từ vị trí gốc của các lớp được biên dịch (ví dụ ở trên nó là E: \ ARMSRemoteUpdater \ WebContent \ WEB-INF \ classes), điều đó sẽ làm việc vì. (dấu chấm - thư mục hiện tại) đã được đặt trong đường dẫn lớp của bạn.

Nhưng ngay khi bạn xóa. (dấu chấm - thư mục hiện tại) từ classpath của bạn, điều kiện làm việc ở trên cũng sẽ thất bại.

Hy vọng tôi đã giải thích chi tiết.

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