1. 程式人生 > >Maven編譯,dubbo.xsd問題解決辦法

Maven編譯,dubbo.xsd問題解決辦法

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>

上面是需要增加的片段。
以上。