java - example - ejecutando el servidor de rmi, classnot found
rmi java ejemplo netbeans (9)
Estoy bastante seguro de que tendrá que iniciar su servidor RMI utilizando el mismo classpath que su aplicación. Creo que toma los mismos parámetros que java, es decir, -cp [your class path]
.
Esta pregunta ya tiene una respuesta aquí:
Hola. Estoy intentando ejecutar una aplicación java que vincula una clase al servidor de nombres, pero constantemente obtengo una ClassNotFoundException
Primero empiezo el registro:
rmiregistry
luego de eclipse intento ejecutar el servidor pero obtengo este error
java.rmi.ServerException: RemoteException se produjo en el hilo del servidor; la excepción anidada es: java.rmi.UnmarshalException: error que descalifica los argumentos; la excepción anidada es: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory en sun.rmi.server.UnicastServerRef.oldDispatch (UnicastServerRef.java:396) en sun.rmi.server.UnicastServerRef.dispatch (UnicastServerRef.java:250) en sun.rmi.transport.Transport $ 1.run (Transport.java:159) en java.security.AccessController.doPrivileged (método nativo) en sun.rmi.transport.Transport.serviceCall (Transport.java:155) en sun.rmi .transport.tcp.TCPTransport.handleMessages (TCPTransport.java:535) en sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0 (TCPTransport.java:790) en sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run (TCPTransport.java:649) en java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886) en java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:908) en java.lang. Thread.run (Thread.java:619) en sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer (StreamRemoteCall.java:255) en sun.rmi.transport.StreamR emoteCall.executeCall (StreamRemoteCall.java:233) en sun.rmi.server.UnicastRef.invoke (UnicastRef.java:359) en sun.rmi.registry.RegistryImpl_Stub.rebind (Fuente desconocida) en progInternet2008.Pozzobon.tesi.Slave. main (Slave.java:54) Causado por: java.rmi.UnmarshalException: error que descalifica argumentos; La excepción anidada es: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory en sun.rmi.registry.RegistryImpl_Skel.dispatch (Fuente desconocida) en sun.rmi.server.UnicastServerRef.oldDispatch (UnicastServerRef.java:386) en sun.rmi .server.UnicastServerRef.dispatch (UnicastServerRef.java:250) en sun.rmi.transport.Transport $ 1.run (Transport.java:159) en java.security.AccessController.doPrivileged (método nativo) en sun.rmi.transport. Transport.serviceCall (Transport.java:155) en sun.rmi.transport.tcp.TCPTransport.handleMessages (TCPTransport.java:535) en sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0 (TCPTransport.java:790) en sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run (TCPTransport.java:649) en java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:886) en java.util.concurrent.ThreadPoolExecutor $ Worker .run (ThreadPoolExecutor.java:908) en java.lang.Thread.run (Thread.java:619) Causado por: java.lang.ClassNotFoundException: progInternet2 008.commons.NominabileFactory en java.net.URLClassLoader $ 1.run (URLClassLoader.java:200) en java.security.AccessController.doPrivileged (método nativo) en java.net.URLClassLoader.findClass (URLClassLoader.java:188) en java .lang.ClassLoader.loadClass (ClassLoader.java:307) en java.lang.ClassLoader.loadClass (ClassLoader.java:252) en java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320) en java.lang.Class. forName0 (Método nativo) en java.lang.Class.forName (Class.java:247) en sun.rmi.server.LoaderHandler.loadProxyInterfaces (LoaderHandler.java:711) en sun.rmi.server.LoaderHandler.loadProxyClass (LoaderHandler. java: 655) en sun.rmi.server.LoaderHandler.loadProxyClass (LoaderHandler.java:592) en java.rmi.server.RMIClassLoader $ 2.loadProxyClass (RMIClassLoader.java:628) en java.rmi.server.RMIClassLoader.loadProxyClass ( RMIClassLoader.java:294) en sun.rmi.server.MarshalInputStream.resolveProxyClass (MarshalInputStream.java:238) en java.io.ObjectInputStream.readProxyDesc (ObjectInputStream.java:1531) en java.io.ObjectInputStream.readClassDesc (ObjectInputStream.java:1493) en java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1732) en java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1329) en java.io. ObjectInputStream.readObject (ObjectInputStream.java:351) ... 12 más
He leído el tutorial de Java de RMI, pero aún no pude hacerlo funcionar ...
Como Argumentos VM he establecido esto:
-Djava.rmi.server.codebase = file: $ {workspace_loc} / progInternet2008
por favor, ayúdame
(Estoy usando Java 6)
La excepción se produce porque la aplicación rmiregistry no sabe de dónde cargar las clases. Cuando intenta vincular un objeto en el registro RMI, el registro descarga la definición de clase para ese objeto. Algunas de las otras respuestas te dicen que evites esto al establecer classpath para la aplicación rmiregistry para que tenga las definiciones de clase cuando se inicia y no necesita descargar nada, pero el tutorial Java RMI de Sun dice explícitamente que no se debe hacer esto Sospecho que esto tiene el potencial de causar conflictos entre la versión de la clase en el registro y la clase en el servidor.
La forma correcta de manejar el problema es establecer la propiedad java.rmi.server.codebase como lo intentaba hacer. La propiedad requiere que una ruta de directorio finalice con una barra diagonal, como se muestra a continuación:
-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/
También puede estar teniendo problemas si la variable $ {workspace_loc} es una ruta relativa y la aplicación rmiregistry no se inició en el mismo directorio para que la ruta relativa no sea la correcta. Si convierte la ruta en absoluta, o inicia el rmiregistry en el directorio apropiado, la ClassNotFoundException debería desaparecer. Consulte el tutorial en la propiedad java.rmi.server.codebase para obtener información un poco más detallada.
intente agregar / bin al final de su VM Arg:
-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/bin
El archivo que ejecutará está en este directorio, por lo que debe incluirlo en la ruta.
Pasé un día entero desinstalando y reinstalando mi JDK y cambiando las variables de clase y las variables de entorno. Pero el culpable fue que el comando de inicio de la migración no inició la investigación de una manera adecuada. Entonces, gracias por los comentarios en esta página, la solución fue desarmar el CLASSPATH temporalmente. Y eso se hace a través del set CLASSPATH=
comandos set CLASSPATH=
Actualicé de JDK1.6.0_33 a 1.7.0_45 y tuve el mismo problema. Encontré este documento y resolví el problema iniciando rmiregistry con:
rmiregistry -Djava.rmi.server.useCodebaseOnly = false
Consulte a continuación http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html
Tuve el mismo problema, para solucionar esto, asegúrese de que su CLASSPATH esté configurada en la ruta que contiene las clases de servidor cuando ejecuta rmiregistry .
En una máquina Linux, ejecute los siguientes comandos.
export CLASSPATH="<server_class_path>"
Asegúrese de que CLASSPATH se haya configurado:
echo $CLASSPATH
Una vez que se ha establecido la ruta de clases, ejecuta rmiregistry
rmiregistry &
Ejecute el comando rmiregisrty
desde su rmiregisrty
/ bin, / build o / build / classes, cualquiera que sea la raíz de sus archivos creados.
Pasé medio día tratando de resolver lo mismo.
Cierre la ventana de cmd donde se inició inicialmente el rmiregistry. En un cmd nuevo, vaya a la ubicación donde se encuentran los archivos de clase de su proyecto (uptill bin) e inicie el registro con el siguiente comando:
rmiregistry -J-Djava.rmi.server.useCodebaseOnly = false
Si está utilizando Eclipse, ejecute ServerSideProject y su instancia de ImplementationClass se enlaza a la URL especificada.
Simplemente imprima una línea debajo del método de encuadernación y verifique si se imprime. Si se imprime con éxito, significa que su servidor está funcionando bien.
De acuerdo, acabo de superar este problema. Cuando ejecute rmiregistry
que su variable de entorno CLASSPATH
esté configurada.
Por ejemplo, puede tener un script:
set CLASSPATH=[path to jdbc driver].jar
rmiregistry.exe
Esto era todo lo que necesitaba para hacer funcionar mi classpath perdido. No estoy seguro de cómo enviar -cp commandline
a rmiregistry.exe
. Su documentación es bastante deficiente.