【问题标题】:no security manager: RMI class loader disabled没有安全管理器:RMI 类加载器已禁用
【发布时间】:2013-12-18 07:19:47
【问题描述】:

我喜欢调用RMI,但是抛出了异常,这是怎么回事?

线程“主”java.rmi.UnmarshalException 中的异常:错误 解组返回;嵌套异常是: java.lang.ClassNotFoundException: test.Hello (没有安全管理器: RMI 类加载器已禁用)在 sun.rmi.registry.RegistryImpl_Stub.lookup(未知来源)在 java.rmi.Naming.lookup(未知来源)在 com.xx.rmiproxy.RmiProxy.call(RmiProxy.java:39) 在 com.xx.rmiproxy.RmiProxy.main(RmiProxy.java:18) 原因: java.lang.ClassNotFoundException:test.Hello(没有安全管理器:RMI 类加载器禁用)在 sun.rmi.server.LoaderHandler.loadProxyClass(未知来源)在 java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)

public String call(String rmiId, String json) throws Exception{

    RmiInterfaceDescription desc = dao.getDescriptionById(rmiId);
    desc.setJarFile("d:\\test.jar");

    RmiClientClassLoader rmiClassLoader = new RmiClientClassLoader(null,desc);

    Class interfaceClass = rmiClassLoader.loadClass(desc.getInterfaceName());
    List<String> paraClasses = desc.getParaClasses();

    Class returnClass = rmiClassLoader.loadClass(desc.getReturnClass());

    Object obj = Naming.lookup(desc.getRmiUrl());

    Class[] parameterTypes = new Class[paraClasses.size()];

    for(int i=0;i<paraClasses.size();i++){
        parameterTypes[i]= rmiClassLoader.loadClass(paraClasses.get(i));
    }

    Method method = interfaceClass.getDeclaredMethod(desc.getMethodName(),
            parameterTypes);

    Object params[] = parseParamsFromJson();
    Object result = method.invoke(obj, "ssd");


    return encode(result);
}

.....

public class RmiClientClassLoader extends URLClassLoader {
public static void main(String args[]) throws Exception {
    RmiInterfaceDescription description = new RmiInterfaceDescription();

    description.setJarFile("d:\\test.jar");
    RmiClientClassLoader cl = new RmiClientClassLoader(null, description);

    Class clientClass = cl.loadClass("test.client.HelloClient");
}

private String basedir;
private RmiInterfaceDescription description;

@SuppressWarnings("deprecation")
public RmiClientClassLoader(String basedir,
        RmiInterfaceDescription description) throws MalformedURLException {
    super(new URL[] { new File(description.getJarFile()).toURL() });
    this.basedir = basedir;
    this.description = description;

}

【问题讨论】:

    标签: java classloader rmi


    【解决方案1】:

    你看错了。此异常的重要部分是 ClassNotFoundException 及其命名的类。需要在客户端部署的任何类,如果您将其作为单独的进程运行,则可用于 Registry。

    我不知道您为什么要定义自己的类加载器。代码库功能通常就足够了。

    【讨论】:

    • 我需要这个功能,其他软件系统的管理员可以上传rmi客户端jar文件并定义他们的rmi接口。
    • 然后可以调用他们定制的rmi。代码库适合这个功能吗?
    • 我已经回答过了。 '代码库功能通常就足够了'。
    【解决方案2】:

    如果您使用注册表查找,由于安全问题,客户端需要具有与存根处理程序类中定义的完整包名称相同的(远程)接口。 只需将远程接口放在定义、客户端和服务器位置中相同的完整包名中即可。

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 2012-06-21
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多