2015-12-08 20 views
5

bieganie do Exception powstałych podczas rozmowy do UnicastRemoteObject.exportObject().Java RMI NoClassDefFoundError dla javax.json.JsonValue Zdalny obiekt

javax.json.jar jest na ścieżce klasy i jest stosowany w wielu innych miejscach w aplikacji bez problemy.

Ta część aplikacji działała poprawnie, dopóki nie dodałem metody, która zwróciła obiekt JsonValue do obiektu zdalnego.

Wszelkie pomysły?

java.rmi.ServerError: Error occurred in server thread; nested exception is: 
    java.lang.NoClassDefFoundError: javax/json/JsonValue 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:416) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:275) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:252) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:378) 
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) 

UWAGA: Próbowałem też prowadzenie rmiregistry o kodzie skierowany bezpośrednio na javax.json.jar ale Wyjątkiem pozostaje

rmiregistry -J-Djava.rmi.server.codebase=file:///JarLibrary/javax.json.jar & 
+0

Czy możesz pokazać nam podpis metody dodanej do zdalnego interfejsu? – QuakeCore

+0

@QuakeCore: public static JsonValue getJsonValue() – jb1

Odpowiedz

3

bieganie do Exception powstałych podczas rozmowy do UnicastRemoteObject.exportObject().

Nie, nie jesteś. Zobacz ślad stosu. To się dzieje w Registry.bind().

Musisz uruchomić serwerz zestawem java.rmi.server.codebase nieruchomości, ale file: // URL codebase nie będzie działać, chyba że albo wszyscy klienci są uruchomione w komputerze serwera, w którym Jeśli w rzeczywistości nie potrzebujesz funkcji kodu źródłowego, lub wskazuje folder współdzielony w formie, z której zarówno Rejestr, jak i klienci mogą korzystać. Zwykle jest to HTTP.

Ale pytam, czy w ogóle potrzebujesz funkcji kodu. Musisz tylko upewnić się, że odpowiedni plik JAR znajduje się na zmiennej CLASSPATH zarówno Rejestru, jak i klientów. Najprostszym sposobem zapewnienia, że ​​dla rejestru jest użycie LocateRegistry.createRegistry() w JVM serwera zamiast zewnętrznego programu rmiregistry.

Zastanawiam się również, dlaczego w ogóle używasz JSON. RMI jest zbudowany na Serializacji Obiektów. Nie musisz dodawać kolejnego serializera.

+0

Dzięki za opinię. Funkcja Registry.bind() jest wywoływana w wyniku mojego kodu wywołującego UnicastRemoteObject.exportObject(). Mój rejestr i serwer działają na tym samym komputerze, klienci są rozproszeni w sieci. Czy mówisz, że nie muszę uruchamiać rmiregistry na zewnątrz, jeśli zadzwonię do LocateRegistry.createRegistry() przed wywołaniem UnicastRemoteObject.exportObject()? Dam temu szansę. Ponadto używam JSON do komunikowania się z siecią serwerów Node.js. – jb1

+0

LocateRegistry.createRegistry() załatwił sprawę! Dziękuję Ci. – jb1

+0

'UnicastRemoteObject.exportObject()' (a) nie wywołuje 'Registry.bind(),' i (b) nie pojawia się w śledzeniu stosu. * Ergo * 'podczas 'UnicastRemoteObject.exportObject()'' nie jest poprawny. – EJP

Powiązane problemy