RMI Class Loader disabled问题

问题描述

RMI服务器端publicclassMyRemoteImpextendsUnicastRemoteObjectimplementsMyRemote{protectedMyRemoteImp()throwsRemoteException{}publicStringsayHello()throwsException{return"Serversays,Hello";}publicstaticvoidmain(String[]args){try{MyRemoteserver=newMyRemoteImp();LocateRegistry.createRegistry(8888);Naming.rebind("RemoteHello",server);}catch(Exceptione){e.printStackTrace();}}}

RMI客户端publicclassMyRemoteClient{publicvoidgo(){try{MyRemoteservice=(MyRemote)Naming.lookup("rmi://127.0.0.1/RemoteHello");Strings=service.sayHello();}catch(Exceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args){newMyRemoteClient().go();}}

执行shell生成_stubclass文件E:workjavaRMIservice>rmicMyRemoteImp

启动服务E:workjavaRMIservice>rmiregistry

启动服务端E:workjavaRMIservice>javaMyRemoteImp

启动客户端E:workjavaRMIservice>javaMyRemoteClient

然后客户端出现异常信息E:workjavaRMIclient>javaMyRemoteClientjava.rmi.UnmarshalException:errorunmarshallingreturn;nestedexceptionis:java.lang.ClassNotFoundException:MyRemoteImp_Stub(nosecuritymanager:RMIclassloaderdisabled)atsun.rmi.registry.RegistryImpl_Stub.lookup(UnknownSource)atjava.rmi.Naming.lookup(Naming.java:101)atMyRemoteClient.go(MyRemoteClient.java:8)atMyRemoteClient.main(MyRemoteClient.java:16)Causedby:java.lang.ClassNotFoundException:MyRemoteImp_Stub(nosecuritymanager:RMIclassloaderdisabled)atsun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:393)atsun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:185)atjava.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)atjava.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)atsun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:214)atjava.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)atjava.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)atjava.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)atjava.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)atjava.io.ObjectInputStream.readObject(ObjectInputStream.java:370)...4more

有人说需要将_stubclass文件设置到classpath下,但我实在当前目录启动的服务,可以不用设置吧?但设置了还是有错

解决方案

解决方案二:
因为你的Client和Service在不同的路径下(这隐含着它们的classpath可能是不相同的,所以Stub有service端有但在Client端没有),方法1:我们手工把Stub类复制到Client端就正常了。方法2:如果是启用RMIClassLoader自动与服务器同步class,我们在客户端需要System.setSecurityManager(newRMISecurityManager());

然后在命令行添加一个-Djava.security.policy=文件路径来启用网络连接这些权限。
解决方案三:
引用1楼humanity的回复:

因为你的Client和Service在不同的路径下(这隐含着它们的classpath可能是不相同的,所以Stub有service端有但在Client端没有),方法1:我们手工把Stub类复制到Client端就正常了。方法2:如果是启用RMIClassLoader自动与服务器同步class,我们在客户端需要System.setSecurityManager(newRMISecurityManager());

然后在命令行添加一个-Djava.security.policy=文件路径来启用网络连接这些权限。

还需要-Djava.rmi.server.codebase=$类路径参数。

时间: 2024-02-22 08:24:32

RMI Class Loader disabled问题的相关文章

java-RMI本地client调用远程服务器上的server报错

问题描述 RMI本地client调用远程服务器上的server报错 代码这篇文章上的.Java RMI之HelloWorld篇 我把ihello,helloimpl,server放在了服务器上,client放在了本机电脑的eclipse中 保证远程服务器上的server正常运行,运行client报错 Caused by: java.lang.ClassNotFoundException: IHello (no security manager: RMI class loader disabled

Microsoft Windows CE 5.0 Board Support Package, Boot Loader, and Kernel Startup Sequence

Mark PlaggeMicrosoft Corporation May 2004 Applies To:     Microsoft Windows CE 5.0 Summary Learn about the initial, low-level startup sequence and the hardware platform functions that are performed when the boot loader and OEM abstraction layer (OAL)

异常-rmi通讯部分方法调用成功,部分调用失败

问题描述 rmi通讯部分方法调用成功,部分调用失败 rmi运行一段时间后,可能是几天也可能是几周.突然rmi客户端出现部分rmi方法调用不通.抛异常java.rmi.unmarshalException:error unmarshlling return;nested exception is; java.io.EOFException at sum.rmi.server.UnicastRef.invoke(UnicastRef.java:173)

rmi-Java RMI疑问(stub、classpath相关)

问题描述 Java RMI疑问(stub.classpath相关) 最近在看之前搞得RMI的东西,搞了好久还是有很多东西没明白,这里列出来希望大家能帮忙解答下==,也算是自己备忘 说jdk1.5之后RMI的stub是动态生成的,这个是利用动态代理吗? 那1.5之前的stub生成会不会类似cglib之类的了-- 如果是动态生成的话,是否仍然需要在registry那边设置classpath?(自己测试,包名不同的registery和远程对象分别部署时好像还是会报ClassNotFound错误) RM

An Overview of RMI Applications

application An Overview of RMI Applications RMI applications are often comprised of two separate programs: a server and a client. A typical server application creates some remote objects, makes references to them accessible, and waits for clients to

Known Bugs in Tomcat 5 while using RMI

Known BugsQ: I installed KIM successfully and I had Tomcat installed before that. SESAME and KIM Server seem to work fine but I get the error (below) when I use Web UI and click to see the Entity Explorer Screen. What is the reason? What can I do? ..

使用sql*loader进行数据导入

数据 环境说明: 数据库:Oracle8.1.6OEM; 系  统:Windows2000 Server.*******************************************************************************************用记事本创建控制文件input.ctl,内容如下: load datainfile 'test.txt'  --数据文件append into table Testfields terminated by '|'

使用SQL*LOADER导入数据

导入数据 Oracle的SQL*LOADER是一个专门用于ORACLE导数据的工具.不过,好多DBA习惯用TOAD导入数据,TOAD这个工具.但是我觉得SQL*LOADER也不错,特别是在批量的时候. 对于初学者,我想声明一点的是,关于那个.CTL文件.我起初以为.CTL文件是ORACLE自己的控制文件.结果搞错了,这个CTL文件是需要你自己写的.也就是说,这个CTL文件就是一个脚本文件,而不是ORACLE启动的控制文件. 今天我做了一写关于SQL*LOADER的测试,写一下大致过程. 1:新建

Java RMI 简单示例

示例 RMI是Java平台实现远程调用的规范,下面是一个小例子,本机测试通过 一共有三个java类,远程接口,服务端程序,客户端程序 远程接口: import java.rmi.*; public interface HelloIn extends java.rmi.Remote{ String sayHello() throws RemoteException;} 服务端程序: import java.rmi.*;import java.net.*;import java.rmi.regist