Problema con carga Dinamica en RMI

Hola a todos, recurro a ustedes porque necesito ayuda con un problema que tengo con la carga dinámica en RMI, espero que puedan ayudarme, he buscado mucho en Google pero no encuentro algo parecido.

Les explico a groso modo como funciona esta aplicación.

Tengo 4 clases:
* Interfaz remota HelloInterface.java
* Objeto remoto HelloServer.java
* Cliente remoto HelloClient.java
* Stub del objeto HelloServer_Stub.java -> Generado con el rmic

Estas 4 clases las tengo en un servidor web.

Ahora tengo 2 clases más:
DynamicServer.java : Carga dinámicamente las clases necesarias para el servidor y registra el objeto remoto.

DynamicClient.java: Carga dinamicamente las clases necesarias para el cliente.

import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RMISecurityManager;
import java.rmi.server.RMIClassLoader;
import java.util.Properties;

public class DynamicServer
{
    public static void main( String args[] )
    {
        // Crear e instalar un gestor de seguridad
        if( System.getSecurityManager() == null )
            System.setSecurityManager( new RMISecurityManager() );

        try
        {
            Properties p = System.getProperties();
            String url = p.getProperty( "java.rmi.server.codebase" );
               
            Class serverclass = RMIClassLoader.loadClass( url, "HelloServer" );

            Naming.rebind( "/HelloServer", (Remote) serverclass.newInstance() );

            System.out.println( "HelloServer bound in registry" );
        }      
        catch( Exception e )
        {
            System.out.println( e );
        }
    }
}

Ahora paso de detallar como ejecuto la aplicación:

* Inicio el registro:

rmiregistry

* Ejecute la clase DynamicServer

java -Djava.security.policy=java.policy
java -Djava.rmi.server.codebase=URL_Archivos DynamicServer

Pero cuando ejecuto esa instruccion, java me muestra un error:

Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 218774561 in class file HelloServer_Skel

Como se bran dado cuenta, el error es por algo relacionado con el Skel, la única solución que encontré fue generar el archivo skel:

rmic -v1.1 HelloServer

Y subirlo el archivo HelloServer_Skel.class al servidor web, y ahora si me funciona la aplicacion, pero mi duda es porque no funciona sin el Skel, si supuestamente por la teoria que encontre el Skel ya no era necesario cuando se usaba el JDK 1.2 o un versión superior.

Ojala alguien me pueda despejar esta duda.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

magic value

Magic value debería ser 0xcafebabe, o 3405691582 en decimal. El valor de tu error en hex es 0d0a3c21. El Skel no es necesario como dices, pero tal vez al tratar de generarlo hay diferencias en versiones de Java (compilaste tus clases con un JDK superior al que tienes donde quieres correr esto).

Ahora... 0d0a son los caracteres \r\n o sea un retorno de línea de Windows, tal vez eso es una pista de algo, sobre todo porque 0x3c21 son los caracteres <! que parecen ser el inicio de un documento HTML (el famoso <!DOCTYPE blabla). O sea que por alguna razón tu server pide la clase Skel al URL que le indicaste y como no hay uno, obtiene una respuesta 404 o algo así pero trata de interpretar el resultado (una página con el error de que no hay nada en ese URL) como una clase.

Siempre me ha parecido muy engorroso utilizar RMI directamente. Con Spring puedes configurar cliente y servidor sin código Java, solamente algunas líneas de XML.

Imagen de bferro

El problema no es con la descarga dinámica

El problema que tienes es de conflictos con los cargadores de clases, que carga a la clase HelloServer en DynamicServer.java y el esqueleto que de manera automática se genera al instanciar un objeto de esa clase en ese mismo programa.
Decir que el esqueleto no se necesita no quiere decir que el esqueleto no existe. El esqueleto existe porque de otra forma no habría la parte del middleware necesaria del lado del servidor. A partir de Java 1.2 no es necesario generarlo con rmic. De hecho, ya no es necesario rmic, con el uso de los proxies dinámicos que se encargan de generar los stubs de lado del cliente, una vez que se obtiene la información del servicio de nombres (registry).
Si la clase HelloServer la tuvieras disponible en la base de código local (classpath) del servidor donde corres la aplicación DynamicServer y creas un objeto directamente de esa clase sin hacer uso de RMIClassLoader no deberías tener problema alguno.