dubbo生产者demo启动报错
最近学习dubbo时,遇到一个奇怪问题:当生产者启动时,报 No application config found or it's not a valid config! Please add <dubbo:application name="..." /> to your spring config
,记录一下解决问题的过程。
报错原因
先说问题结论:jdk版本过高,导致dubbo容器启动失败,demo的dubbo版本是2.7.5,使用jdk11编译运行就会报上述错误,使用jdk1.8就能正常运行。
为什么jdk11会导致dubbo-2.7.5的容器启动失败呢
用两个版本的jdk分别调试发现,BeanFactory中的beanDefinitionMap数量不一样,jdk1.8环境下要多一个org.springframework.context.annotation.internalCommonAnnotationBeanPostProcessor。
CommonAnnotationBeanPostProcessor类在spring中是一个极其重要的类,它负责解析@Resource、@WebServiceRef、@EJB三个注解,而Dubbo容器也依赖这个处理类,没有它的话,dubbo容器启动时,无法把dubbo相关的bean放入ConfigManager中的configsCache。
为什么jdk11环境,spring的BeanFactory会缺少CommonAnnotationBeanPostProcessor
demo程序是使用AnnotationConfigApplicationContext来启动spring容器,它初始化的过程中,有一段检查JSR-250规范的代码:
// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}
private static final boolean jsr250Present =
ClassUtils.isPresent("javax.annotation.Resource", AnnotationConfigUtils.class.getClassLoader());
调试发现,jsr250Present在jdk11环境下是false,在jdk1.8环境下是true,就是这里导致jdk11环境下,spring的BeanFactory缺少CommonAnnotationBeanPostProcessor。
结语
这个案例告诉我们,学习整合各种框架的时候,要注意各个框架运行环境是否一致,不要盲目使用框架的最新版本,也不要盲目升级jdk版本。