2015-12-08 10 views
5

Esecuzione in Eccezione causato durante la chiamata al UnicastRemoteObject.exportObject().Java RMI NoClassDefFoundError per javax.json.JsonValue in oggetto a distanza

javax.json.jar è sul classpath ed è usato in molti altri luoghi nella richiesta senza alcun i problemi.

Questa parte dell'applicazione ha funzionato fino a quando non ho aggiunto un metodo che restituiva un JsonValue all'oggetto remoto.

Qualche idea?

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) 

NOTA: Ho anche provato a fare funzionare il rmiregistry con codebase rilevare direttamente la javax.json.jar ma l'eccezione rimane

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

Potresti mostrarci la firma del metodo che hai aggiunto all'interfaccia remota? – QuakeCore

+0

@QuakeCore: public static JsonValue getJsonValue() – jb1

risposta

3

Esecuzione in Eccezione causato durante la chiamata al UnicastRemoteObject.exportObject().

No, non lo sei. Vedi la traccia dello stack. Sta accadendo in Registry.bind().

È necessario eseguire il servercon il set java.rmi.server.codebase proprietà, ma un file: // codebase URL non è andare a lavorare a meno che non sia tutti i clienti sono in esecuzione nel server host, in cui caso in cui non si ha realmente bisogno della funzionalità codebase o punta a una cartella condivisa in una forma che sia il Registro che i client possono utilizzare. Di solito è HTTP.

Ma mi chiedo se sia necessaria la funzionalità del codice base. Devi solo assicurarti che il file jar pertinente si trovi sul CLASSPATH sia del Registro che dei client. Il modo più semplice per garantire che per il Registro di sistema sia utilizzare LocateRegistry.createRegistry() nella JVM del server anziché il programma esterno rmiregistry.

Mi sto anche chiedendo perché stai usando JSON. RMI è costruito su Object Serialization. Non è necessario aggiungere un altro serializzatore.

+0

Grazie per il feedback. Registry.bind() viene chiamato come risultato del mio codice che chiama UnicastRemoteObject.exportObject(). Il mio registro e il mio server sono in esecuzione sulla stessa macchina, i client sono distribuiti su una rete. Stai dicendo che non è necessario eseguire rmiregistry esternamente se chiamo LocateRegistry.createRegistry() prima di chiamare UnicastRemoteObject.exportObject()? Lo proverò. Inoltre, sto usando JSON per comunicare con una rete di server Node.js. – jb1

+0

LocateRegistry.createRegistry() ha fatto il trucco! Grazie. – jb1

+0

'UnicastRemoteObject.exportObject()' (a) non chiama 'Registry.bind(),' e (b) non appare nello stack trace. * Ergo * 'durante 'UnicastRemoteObject.exportObject()'' non è corretto. – EJP