dubbox
dubbox copied to clipboard
dubbo集成到spring-boot,使用spring-boot-devtools时创建rest服务异常
dubbo集成到spring-boot,开发模式下使用了spring-boot-devtools,在创建rest服务时,出现异常,堆栈如下: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServiceImpl' defined in file [F:\code\newyan-api-server\bin\com\newsmy\newyan\service\impl\UserServiceImpl.class]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: interface com.newsmy.newyan.service.UserService is not visible from class loader at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] at com.newsmy.newyan.Application.main(Application.java:14) [bin/:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_72] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_72] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_72] at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_72] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-1.4.0.RELEASE.jar:1.4.0.RELEASE] Caused by: java.lang.IllegalArgumentException: interface com.newsmy.newyan.service.UserService is not visible from class loader at com.alibaba.dubbo.common.bytecode.Proxy.getProxy(Proxy.java:98) ~[dubbo-common-2.8.4.jar:2.8.4] at com.alibaba.dubbo.common.bytecode.Proxy.getProxy(Proxy.java:67) ~[dubbo-common-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:35) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.proxy.AbstractProxyFactory.getProxy(AbstractProxyFactory.java:49) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.proxy.wrapper.StubProxyFactoryWrapper.getProxy(StubProxyFactoryWrapper.java:60) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.ProxyFactory$Adpative.getProxy(ProxyFactory$Adpative.java) ~[dubbo-common-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.protocol.AbstractProxyProtocol.export(AbstractProxyProtocol.java:69) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper.export(ProtocolListenerWrapper.java:56) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper.export(ProtocolFilterWrapper.java:55) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.Protocol$Adpative.export(Protocol$Adpative.java) ~[dubbo-common-2.8.4.jar:2.8.4] at com.alibaba.dubbo.registry.integration.RegistryProtocol.doLocalExport(RegistryProtocol.java:153) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.registry.integration.RegistryProtocol.export(RegistryProtocol.java:107) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper.export(ProtocolListenerWrapper.java:54) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper.export(ProtocolFilterWrapper.java:53) ~[dubbo-rpc-api-2.8.4.jar:2.8.4] at com.alibaba.dubbo.rpc.Protocol$Adpative.export(Protocol$Adpative.java) ~[dubbo-common-2.8.4.jar:2.8.4] at com.alibaba.dubbo.config.ServiceConfig.doExportUrlsFor1Protocol(ServiceConfig.java:489) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.config.ServiceConfig.doExportUrls(ServiceConfig.java:285) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.config.ServiceConfig.doExport(ServiceConfig.java:246) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.config.ServiceConfig.export(ServiceConfig.java:145) ~[dubbo-2.8.4.jar:2.8.4] at com.alibaba.dubbo.config.spring.AnnotationBean.postProcessAfterInitialization(AnnotationBean.java:202) ~[dubbo-2.8.4.jar:2.8.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] ... 17 more
我查了下问题原因是采用spring-boot-devtools会存在两个classloader,一个是应用类加载器AppClassLoader,一个RestartClassLoader,AppClassLoader用于加载第三方jar,而RestartClassLoader用于加载用户目录下的class。使用rest协议时,会为每个service创建代理类,com.alibaba.dubbo.common.bytecode.Proxy创建代理类时,是用proxy所在classloader为AppClassLoader,去加载用户目录下的class,自然就会报class不可见。
针对这个问题,不知开发组是否可以修改下,谢谢!
提议非常好、你有什么好的方案可以直接提出来。哈哈
去掉devtools的依赖
很好!多谢楼上回复。
简单地去掉devtools依赖,只是回避了问题。devtools在开发阶段是非常有价值、高效的,任何修改可以立即生效。我修改了com.alibaba.dubbo.common.bytecode.Proxy.getProxy()方法, 由 public static Proxy getProxy(Class>... ics) { return getProxy(ClassHelper.getCallerClassLoader(Proxy.class), ics); } 改成: public static Proxy getProxy(Class>[] ics) { return getProxy(Thread.currentThread().getContextClassLoader(), ics); } 我测试了下使用rest协议,添加devtool依赖与否,service也是可以正常创建。其它场景则没有验证过。
@d2h57 支持一下!修改com.alibaba.dubbo.common.bytecode.Proxy.getProxy()方法感觉有点大了。哈哈
在项目里 resources\META-INF\spring-devtools.properties
里添加
restart.include.dubbo=/dubbo-[\\d\\.]+\\.jar
@d2h57 修改代码后是不会报错了,但是修改配置后restart后端口不会被释放掉
厉害了我的哥
两个maven模块,a模块依赖b模块,在a模块中,使用main方式启动,爆 xx is not visible from class loader, 解决办法在a模块中新建META-INF/spring-devtools.properties,文件中定义restart.exclude.dependency=/b/target/classes/,这样restart class loader不再加载b中的类,这个类,只有appclassloader加载,就不会出现异常了。