Java RMI InitialContext:LocateRegistry.createRegistry(int)的等价物?

时间:2010-03-10 09:38:54

标签: java registry rmi initial-context

我正在尝试一些非常基本的RMI:

//   Context namingContext = new InitialContext();
         Registry reg = LocateRegistry.createRegistry(9999);
         for ( int i = 0; i < objs.length; i++ ) {
            int id = objs[i].getID();
//            namingContext.bind( "rmi:CustomObj" + id , objs[i] );
            reg.bind( "CustomObj" + id , objs[i] );
         }

这很顺利,但为了将来的目的,我需要使用InitialContext

         Context namingContext = new InitialContext();
         for ( int i = 0; i < objs.length; i++ ) {
            int id = objs[i].getID();
             namingContext.bind( "rmi:CustomObj" + id , objs[i] );
         }

但我不能让这个工作。我从命令行启动了rmiregistry。是否有LocateRegistry.createRegistry(int)的等价物?或者从我的类中启动InitialContext使用的RMI注册表/注册表的其他方法? (而不是命令行)


堆栈追踪:

javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: bguiz.scratch.network.eg.Student]
        at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:126)
        at com.sun.jndi.toolkit.url.GenericURLContext.bind(GenericURLContext.java:208)
        at javax.naming.InitialContext.bind(InitialContext.java:400)
        at bguiz.scratch.RMITest.main(RMITest.java:29)
Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: bguiz.scratch.CustomObj
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
        ....(truncated)

编辑:我会在几天内删除我自己的问题,因为似乎没有答案(我自己无法弄明白)。最后要求任何咬人!

3 个答案:

答案 0 :(得分:1)

经过多次修修补补,我解决了这个问题。仅供参考,这就是它:

由于RMI注册表有自己的类路径,因此ClassNotFoundException被抛出。包含InitialContext的类在其类路径上具有自定义对象并不重要 - 必须初始化RMI注册表,以使自定义对象也在的类路径上

为此,请在开始classpath之前在命令行上设置rmiregistry环境值。如果此类路径包含自定义对象的类,则不会抛出ClassNotFoundException,并且随后会避免ServerException和`CommunicationException'。

答案 1 :(得分:0)

  

是否有等效的LocateRegistry.createRegistry(int)

没有

  

或者从我的类中启动InitialContext使用的RMI注册表/注册表的其他方法吗?

LocateRegistry.createRegistry()

我几乎可以肯定你需要在URL中指定主机名。什么例外&amp;你得到错误信息吗?

答案 2 :(得分:0)

java.lang.ClassNotFoundException: bguiz.scratch.network.eg.Student caused by
java.lang.ClassNotFoundException: bguiz.scratch.CustomObj

检查此课程是否可用?