2012-03-02 10 views
6

następującą metodę:java.rmi.ServerException: RemoteException wystąpił w wątku serwera (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); 
    } 
} 

rzuca ten wyjątek: 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

kiedy zaczynam mój projekt, ja jestem witany z komunikatem w JOptionPane mówi: problem z uruchomieniem serwera, a następnie powyższym wyjątkiem. Jaki może być tego powód?

Nie rozumiem dlaczego ostatnie stwierdzenie wyjątku mówi klasa nie znaleziono EXC kiedy mam importowane odpowiednie pakiety

Odpowiedz

11

Istnieją trzy przypadki tego wyjątku.

  1. Przy eksporcie: Nie uruchamiać „rmic” i nie podejmuje działania opisane w preambule do Javadoc dla UnicastRemoteObject aby to niepotrzebne.

  2. Podczas wiązania: rejestr nie ma kodu pośredniczącego lub interfejsu zdalnego lub czegoś, na czym polegają w swojej ścieżce klasy.

  3. Przy przeglądaniu: klient nie ma tych rzeczy w swojej klasie.

To jest przypadek 2. Rejestr nie może znaleźć nazwanej klasy.

Istnieją cztery rozwiązania:

  1. Uruchom rejestr z CLASSPATH, która zawiera odpowiednie JAR lub katalogów.

  2. Uruchom rejestr w swoim JVM serwera poprzez LocateRegistry.createRegistry().

  3. używać dynamicznych odcinki, jak opisano w preambule do Javadoc z UnicastRemoteObject. Jednak możesz wtedy jeszcze napotkasz ten sam problem z interfejsem zdalnym samej lub klasa, od której to zależy, w którym to przypadku 1-3 powyżej mają nadal zastosowanie do tej klasy/tych klas.

  4. Użyj funkcji codebase. Jest to naprawdę opcja wdrożenia i IMO, którego należy unikać na początkowym etapie rozwoju.

+0

Problem został rozwiązany, ale czy nadal potrzebujemy pliku pośredniczącego? –

+0

@SuhailGupta Zobacz preambułę do 'java.rmi.server.UnicastRemoteObject'. Konieczne jest tylko wygenerowanie klasy pośredniej, jeśli używasz języka Java <1.5 lub nie postępujesz zgodnie z tymi wskazówkami. Skoro otrzymałeś ten wyjątek, jednoznacznie jedno z nich jest prawdą. – EJP

+0

Używam java> 1.5. I moja klasa rozszerza UnicastRemoteObject. Jestem nieco przestarzały. [Oto mały kod, którego użyłem] (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 

Błąd bardzo prosty do rozwiązania będzie wykonać następujące czynności:

  • Na przykład plik java rozważenia dysk D
  • start rmiregistry D Napęd (przykład D: \ rozpocząć rmiregistry), a następnie nie uruchamiaj rmiregistry na innych napędach, spowoduje to powyższy błąd:
(Gdziekolwiek jesteś file is, start rmiregistry)
+0

Wow, to faktycznie zadziałało dla mnie ... chociaż nie wiem dlaczego? czy ktoś może wyjaśnić, co tu się dzieje? – ultrajohn

+1

@ultrajohn Zobacz moją odpowiedź. Ta działa, ponieważ umieszcza wymaganą klasę w CLASSPATH rejestru, ale tylko wtedy, gdy klasa ta nie znajduje się w pakiecie. Gdyby tak było, to by nie działało. -1 z powodu braku wyjaśnienia i rozwiązania specjalnego przypadku. – EJP

-1

Możesz uruchomić rmiregistry z dowolnego miejsca, ale musisz się upewnić, że skompilowane klasy są już w Twojej ścieżce klas. Na przykład: -

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 

Powyższe powinno działać poprawnie.

Ogólnie, jeśli uruchomisz rmiregistry z katalogu głównego skompilowanych klas (powyższy przykład to E: \ ARMSRemoteUpdater \ WebContent \ WEB-INF \ classes), to zadziała, ponieważ. (dot - aktualny katalog) jest już ustawiony w ścieżce klas.

Ale zaraz po usunięciu. (kropka - aktualny katalog) ze swojej ścieżki klasy, powyższy warunek pracy również się nie powiedzie.

Mam nadzieję, że wyjaśniłem szczegółowo.

Powiązane problemy