Poseemos la mejor información que hallamos por todo internet. Esperamos que te resulte útil y si quieres compartir algo que nos pueda ayudar a mejorar hazlo con total libertad.
Solución:
Hay cuatro casos de esta excepción.
-
Al exportar: no ejecutó ‘rmic’ y no siguió los pasos descritos en el preámbulo del Javadoc para
UnicastRemoteObject
para hacerlo innecesario. -
Al vincular: el Registro no tiene el código auxiliar o la interfaz remota o algo de lo que dependen en su classpath.
-
al mirar hacia arriba: el cliente no tiene estas cosas en su classpath.
-
Al llamar a un método remoto: envió algo al servidor de una clase que no está presente en su CLASSPATH, o recibió algo del servidor (incluida una excepción) de una clase que no está en su CLASSPATH: en ambos casos, posiblemente una clase o interfaz derivada implementación de una clase o interfaz mencionada en la firma del método de la interfaz remota.
Este es el caso 2. El Registro no puede encontrar la clase nombrada.
Hay varias soluciones:
-
Inicie el Registro con un CLASSPATH que incluya los JAR o directorios relevantes.
-
Inicie el Registro en su servidor JVM, a través de
LocateRegistry.createRegistry().
-
Use stubs dinámicos, como se describe en el preámbulo del Javadoc de
UnicastRemoteObject.
Sin embargo, aún puede encontrarse con el mismo problema con la interfaz remota en sí o con una clase de la que depende, en cuyo caso 1-3 anterior aún se aplica a esa clase/esas clases. -
Asegúrese de que el caso (4) anterior no ocurra.
-
Utilice la función de base de código. Esta es realmente una opción de implementación y, en mi opinión, algo que debe evitarse en la etapa de desarrollo inicial.
Remote Server Error:RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: mathInterface
El error es muy simple de resolver para realizar los siguientes pasos:
- Por ejemplo, su archivo java considera la unidad D
- Inicie rmiregistry D drive (ejemplo D:start rmiregistry) luego no inicie rmiregistry en las otras unidades, generará el error anterior
(Donde sea que esté su archivo, comience rmiregistry
)
Voy a tratar de explicar lo mejor posible lo que hice: 1ro. Declaré la variable classpath como sigue:
set classpath=%classpath%
set classpath=C:compiler
set classpath=C:compilerlibrocap07rmihelloHello.java
set classpath=C:compilerlibrocap07rmihelloServer.java
set classpath=C:compilerlibrocap07rmihelloClient.java
- (Todo en un conjunto de líneas:
set classpath=%classpath%;C:compiler;C:compilerlibrocap07rmihelloHello.java;C:compilerlibrocap07rmihelloServer.java;C:compilerlibrocap07rmihelloClient.java)
- (No estoy seguro si los archivos .java eran necesarios, pero también los escribí por dudas).
2do. Compilé con la línea javac -d C:compiler Hello.java Server.java Client.java
. Dónde C:compiler
es el directorio raíz como src en Eclipse IDE.
3er. corrí el start rmiregistry
línea. (y no importa donde lo ejecutes, es lo mismo).
4to. corrí:
start java -classpath C:compiler -Djava.rmi.server.codebase=file:C:compiler/ libro.cap07.rmi.hello.Server
Usted ya sabe C:compiler
, pero necesita definir la dirección de los paquetes en la última para que el comando pueda encontrar los archivos .class. Abra cualquier archivo .java y copie la dirección del paquete sin paquetes sentense. Verá cuando abra el directorio src (en mi caso C: compilador), encontrará toda la secuencia de directorio creada. Cuando esta línea de comando se crea correctamente, no importa dónde la ejecute, C:, D:, src, en cualquier lugar donde se ejecute.
5to. Y finalmente, ejecuté la clase Client con:
java -classpath C:compiler libro.cap07.rmi.hello.Client
En conclusión, si la variable classpath no se crea o se crea incorrectamente o la oración del cuarto punto no se aborda bien, la JVM arroja el mismo error o uno similar. ¡Busca allí!
(Perdon por mi inglés).
Si aceptas, tienes el poder dejar un enunciado acerca de qué le añadirías a esta crónica.