openfire 部署后报错: java.lang.IllegalArgumentException: interface xx is not visible from class loader(示例
Posted 不知为何就叫呵呵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openfire 部署后报错: java.lang.IllegalArgumentException: interface xx is not visible from class loader(示例相关的知识,希望对你有一定的参考价值。
该异常是创建代理时加载接口的类加载器与创建时传入的不一致。
在本地eclipse做openfire二次开发,本地运行没错,部署到服务器上后报异常:
java.lang.IllegalArgumentException: interface xx is not visible from class loader。
根据异常信息,可知是动态代理时出错的。而在之前部署过却没有这异常发生。
从日志上分析,可以找到抛异常的地方是:
Class<?> interfaceClass = null; try { interfaceClass = Class.forName(interfaceName, false, loader); } catch (ClassNotFoundException e) { } if (interfaceClass != interfaces[i]) { throw new IllegalArgumentException( interfaces[i] + " is not visible from class loader"); }
interfaceClass 为null值。
然后对比之前的开发代码:
之前: public RPCGameAction gameAction = (RPCGameAction) Container .createRemoteService(RPCGameAction.class, "gamecenter"); 现在: public RPCGameAction getGameAction(String prefix) { return (RPCGameAction) Container .createRemoteService(RPCGameAction.class, prefix); }
而创建代理的代码中的获取类加载器的代码为:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
前者会在初始化的时候已经创建好,而后者会根据运行时的ClassLoader而创建,而openfire加载插件的类加载器跟运行的不一致,从而导致创建失败。
解决的方法可以是:RPCGameAction 这个代理随插件启动而创建到内存中;
把接口所处的jar包放到../openfire/lib 目录下。
以上是关于openfire 部署后报错: java.lang.IllegalArgumentException: interface xx is not visible from class loader(示例的主要内容,如果未能解决你的问题,请参考以下文章
(转载)Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderListener
Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderListener
解决用户自生成meta导入kylin后报错问题Can not deserialize instance of java.lang.String[] out of VALUE_STRING token(