Maven編譯,dubbo.xsd問題解決辦法
阿新 • • 發佈:2019-02-06
Maven編譯,dubbo.xsd問題的解決辦法
錯誤現象
專案使用dubbo服務,在maven編譯時,專案出現例如:
org.springframework.beans.factory.xml.XmlBeanDefinitionReader -
Ignored XML validation warning
org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd' , because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
或者
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath:/beans/dubbo-consumer.xml]
Offending resource: class path resource [beans/applicationContext.xml]; nested exception is org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 11 in XML document from class path resource [beans/dubbo-consumer.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 11; columnNumber: 59 ; cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dubbo:application'.
這樣的錯誤資訊,可能兩者皆有。
錯誤原因
該錯誤是由於dubbo:reference的定義在網路上不存在,阿里關於dubbo的XMLschema的例項訪問不了造成的,就是下面的這句話
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
解決辦法
解決該問題主要有兩種辦法。
1. eclipse中修改xml參照路徑,索引到本地dubbo.xsd檔案(有一定限制),網上查詢的大部分為該方法。
略。請自行搜尋。
2. 將dubbo.xsd檔案編譯在工程中(通用)
將dubbo.xsd儲存在工程的classpath目錄中,並且在dubbo的XMLschema的參照出,修改為參照專案的工程路徑下檔案,程式碼如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo classpath:/dubbo.xsd">
本專案由於使用jenkins自動編譯,無法通過本地eclipse匯入的辦法,智慧採用辦法2,這樣其他人修改時也不受影響。唯一的問題是編譯的內容略微增加,系統程式碼有一點點侵入。
注意事項
按照辦法2修改時,系統會出現 Unable to locate Spring NamespaceHandler for XML schema namespace 的錯誤,如下
ERROR org.springframework.web.context.ContextLoader -
Context initialization failed
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath:/beans/dubbo-consumer.xml]
Offending resource: class path resource [beans/applicationContext.xml]; nested exception is org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://code.alibabatech.com/schema/dubbo]
Offending resource: class path resource [beans/dubbo-consumer.xml]
就是提示無法指向XMLschema namespace,出現該問題說明剛才的修改已經成功,但是本專案中參照dubbo服務失敗,需要在pom檔案中顯示指定dubbo相關的參照。Provider提供的API中指定的dubbo服務無法使用在本專案中。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
上面是需要增加的片段。
以上。