2012-03-02 56 views
6

El siguiente método:java.rmi.ServerException: RemoteException ocurrió en hilo de servidor (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); 
    } 
} 

lanza esta excepción: 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

cuando comienzo mi proyecto, me da la bienvenida con el mensaje de JOptionPane diciendo problema al iniciar el servidor y luego la excepción anterior. ¿Cuál podría ser el motivo de esto?

No entiendo por qué hace la última declaración de excepción dice clase no encontró exc cuando he importado los paquetes correctos

Respuesta

11

Hay tres casos de esta excepción.

  1. Cuando se exporta: No se ejecutó 'rmic' y que no toma las medidas descritas en el preámbulo de la Javadoc para UnicastRemoteObject para que sea innecesario.

  2. Cuando vincula: el Registro no tiene el stub o la interfaz remota o algo de lo que dependen en su classpath.

  3. al buscar: el cliente no tiene estas cosas en su classpath.

Este es el caso 2. El Registro no puede encontrar la clase nombrada.

Hay cuatro soluciones:

  1. iniciar el registro con una ruta de clases que incluye los JAR o directorios pertinentes.

  2. Iniciar el registro en la JVM del servidor, a través de LocateRegistry.createRegistry().

  3. Use talones dinámicos, como se describe en el preámbulo de la Javadoc de UnicastRemoteObject. Sin embargo es posible que entonces todavía topado con el mismo problema con la interfaz remota sí mismo o una clase de la que depende, en cuyo caso 1-3 anterior todavía se aplica a esa clase/esas clases.

  4. Utilice la función de base de código. Esta es realmente una opción de implementación y OMI algo que debe evitarse en la etapa de desarrollo inicial.

+0

El problema está resuelto, pero ¿todavía necesitamos un archivo de resguardo? –

+0

@SuhailGupta Vea el preámbulo de 'java.rmi.server.UnicastRemoteObject'. Solo necesita generar una clase de código auxiliar si está utilizando Java <1.5 o si no está siguiendo esas pautas. Como obtuviste esa excepción, claramente uno de esos dos es cierto. – EJP

+0

Estoy usando java> 1.5. Y mi clase extiende UnicastRemoteObject. Estoy algo anticuado. [Este es el pequeño código que he usado] (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 

El error muy simple de resolver para ser realizar los pasos siguientes:

  • Por ejemplo el archivo de java consideran la unidad D
  • inicio rmiregistry D unidad (ejemplo D: \ comenzar rmiregistry) luego no inicie rmiregistry en las otras unidades, producirá el error anterior

(Donde sea su el archivo es, comience rmiregistry)

+0

guau, esto realmente funcionó para mí ... aunque no sé por qué? ¿Alguien puede explicar lo que está sucediendo aquí? – ultrajohn

+1

@ultrajohn Vea mi respuesta. Este funciona porque pone la clase requerida en el CLASSPATH del Registro, pero solo si esa clase no está en un paquete. Si lo fuera, no funcionaría. -1 por falta de explicación y solución de caso especial. – EJP

-1

Puede iniciar rmiregistry desde cualquier lugar, pero debe asegurarse de que las clases compiladas ya estén en su classpath. Por ejemplo: -

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 

Y todo lo anterior debería funcionar bien.

En general, si inicia rmiregistry desde la ubicación raíz de las clases compiladas (por ejemplo, es E: \ ARMSRemoteUpdater \ WebContent \ WEB-INF \ classes), eso funcionará porque. (punto - directorio actual) ya está establecido en su classpath.

Pero tan pronto como lo elimine. (punto - directorio actual) de su classpath, las condiciones de trabajo anteriores también fallarán.

Espero haber explicado en detalles.

Cuestiones relacionadas