我正在尝试一些非常基本的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)
的等价物?还是通过其他方法从类内部启动RMI注册表/ InitialContext
使用的注册表? (而不是命令行)堆栈跟踪:
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)
编辑:我将在几天后删除自己的问题,因为似乎对此没有任何答案(我自己无法弄清楚)。最后呼吁任何痛苦!
最佳答案
经过大量修补,我已经解决了问题。仅供参考,这是什么:
由于RMI注册表具有自己的类路径,因此会抛出ClassNotFoundException
。包含InitialContext
的类在其类路径上具有自定义对象都没有关系-必须初始化RMI注册表,以使自定义对象也位于其类路径上。
为此,在启动classpath
之前,在命令行上设置rmiregistry
环境值。如果此类路径包含自定义对象的类,则不会引发ClassNotFoundException
,因此避免使用ServerException
和`CommunicationException'。