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<?> java.lang.reflect.Proxy.getProxyClass0(ClassLoader loader, Class<?>... interfaces);
 
由于服务器上不能断点分析,以及无法修改jdk添加日志,通过复制关键代码到自己代码开始抛出异常处打印日志,发现:
            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(

安装ant后报错

spring boot 使用java9上传到github其他人clone后报错

Tomcat部署应用后报错