Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd

来源:互联网 发布:大量淘宝买家手机号码 编辑:程序博客网 时间:2024/05/22 03:17

公司一直在使用阿里的dubbo,但是阿里的的开源网站http://code.alibabatech.com,已经很长时间不能用了,但为什么我们的应用启动没有问题?

我们都知道Spring在启动时是要检验XML文件的,首先来看下xml的一些概念:

(1)xml的schema里的namespace

可以给它起个别名,比如常见的spring的namespace:

xmlns:mvc="http://www.springframework.org/schema/mvc"  xmlns:context="http://www.springframework.org/schema/context"

通常情况下,namespace对应的URI是一个存放XSD的地址,尽管规范没有这么要求,如果没有提供schemaLocation,那么Spring的XML解析器会从namespace的URI里加载XSD文件。

(2)schemaLocation

提供了一个xml namespace到对应的xsd文件的一个映射,所以我们可以看到,在schemaLocation后面配置的字符串都是成对的,前面的是namespace的URI,后面的是xsd文件的URI。比如:

xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/security  http://www.springframework.org/schema/security/spring-security.xsd" 

(3)Spring是如何校验XML的

Spring默认在启动时是要加载xsd文件来验证xml文件的,所以如里有的时候断网了,或者一些开源软件切换域名了,那么就很容易碰到应用启动不了。为了防止这种情况,Spring提供了一种机制,默认从本地加载xsd文件。打开spring-context-*.jar,可以看到里面有两个特别的文件:

spring.handlers

http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler  http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler  http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler  http\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler  http\://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler  


spring.schemas

http\://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd  http\://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd  http\://www.springframework.org/schema/context/spring-context-3.1.xsd=org/springframework/context/config/spring-context-3.1.xsd  http\://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd  http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd 


再打开jar包里的org/springframework/context/config/目录,可以看到下面有xsd文件。很明显,spring是把xsd文件放到本地了,再在spring.schemas里做了一个映射,优先从本地里加载xsd文件。并且也把旧版本的xsd文件也全放了。这样可以防止升级了spring版本,而配置文件里用的还是旧版本的xsd文件,然后断网,应用启动不了。在没有配置版本号时,用的就是当前版本的xsd文件。

所以,Spring在加载dubbo时,会从dubbo的jar里加载dubbo.xsd,虽然启动没有问题,但xml验证Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd出错。


MyEclipse->Window->Preferences->MyEclipse->File and Editors->XML->XML Catalog

选择“User Specified Entries” 点击右边的“Add ..”,在弹出的“Add XML Catalog Element”对话框中为Location输入添加xsd文件所在路径,key type选择namespace name,key需要以/dubbo.xsd结尾。

阅读全文
0 0
原创粉丝点击