Maven 是一個(gè) java 開發(fā)人員很難繞過的構(gòu)建工具, 因?yàn)橛斜姸嗟拈_源項(xiàng)目都使用 Maven 作為其構(gòu)建工具。 而閱讀 maven 中的 pom 文件, 是了解一個(gè)項(xiàng)目依賴關(guān)系和構(gòu)建方式的重要環(huán)節(jié)。 但是 pom 文件的頭部會讓初學(xué)者感到困惑, 這里對其進(jìn)行一個(gè)清晰易懂的解釋(梳理自網(wǎng)絡(luò)資料)
理解 xml 中的標(biāo)簽含義, 及標(biāo)簽之間樹狀的嵌套結(jié)構(gòu)
了解 pom ( project object model)文件
<project xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://maven.apache.org/POM/4.0.0' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd'>
1
2
初學(xué)者看到如上的內(nèi)容應(yīng)當(dāng)有如下困惑點(diǎn):
xmlns:xsi
, xmlns
, xsi:schmeLocation
這些看上去相近的屬性是什么含義, 為什么他們的值是不一樣的 URL
這些 URL 是否對應(yīng)一些可以訪問的資源,對于該文件的解析是否會需要下載這些 URL 對應(yīng)的資源
一個(gè) xml 文檔中如果包含如下兩種定義不同, 但是名稱相同的元素, xml 解析器是無法解析的, 因?yàn)樗荒艽_定當(dāng)你調(diào)用 document.getElementsByTagName('book')
時(shí)應(yīng)該返回哪個(gè)元素。
<!-- 這里的 table 元素描述的是一個(gè)表格--><table> <tr> <td>Apples</td> <td>Bananas</td> </tr></table><!-- 這里的 table 元素描述的是一個(gè)家居桌子--><table> <name>African Coffee Table</name> <width>80</width> <length>120</length></table>
1
2
3
4
5
6
7
8
9
10
11
12
13
顯然, 如果給他們的名字添加一個(gè)前綴, 則命名沖突的問題就可以解決。
<!-- 這里的 table 元素描述的是一個(gè)表格--><h:table> <!--添加了前綴 h --> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr></h:table><!-- 這里的 table 元素描述的是一個(gè)表格--><f:table> <!--添加了前綴 f --> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length></f:table>
1
2
3
4
5
6
7
8
9
10
11
12
13
但是, 在一個(gè)擁有眾多元素的文檔中, 僅僅擁有前綴, 也不能完全避免命名沖突的問題。
注意 xml 文檔相互之間是可以通過 XInclude, External Entites 實(shí)現(xiàn)相互包含或者引用的。
此時(shí), 命名空間就誕生了, 我們可以為元素定義一個(gè)命名空間, 將一個(gè)很長的, 可以保證全局唯一性的字符串與該元素關(guān)聯(lián)起來。這樣就可以避免命名沖突了。
但是如何保證那個(gè)較長的字符串全局唯一呢, 最好的方式莫過于使用 統(tǒng)一資源標(biāo)識符(Uniform Resource Identifier,URI) 了, 而我們最常見的 URI 就是平時(shí)經(jīng)常訪問的網(wǎng)址 URL 了。
xmlns:namespace-prefix='namespaceURI'
1
應(yīng)用到我們所舉的例子中就是:
<!-- 這里的 table 元素描述的是一個(gè)表格--><h:table xmlns:h='http://www.w3.org/TR/html4/'> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr></h:table><!-- 這里的 table 元素描述的是一個(gè)表格--><f:table xmlns:f='http://www.w3school.com.cn/furniture'> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length></f:table>
1
2
3
4
5
6
7
8
9
10
11
12
13
所以, 對于命名空間的標(biāo)識符, URI 的作用僅僅是保證唯一性, 它并不需要對應(yīng)一個(gè)可以訪問的資源或文件 ! 但是, 有很多公司都會讓 namespace 的 URI 指向一個(gè)包含該命名空間信息的網(wǎng)頁
回到我們的 POM 文檔頭中,你會發(fā)現(xiàn) project xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
中的http://www.w3.org/2001/XMLSchema-instance可以訪問到一個(gè)正常的頁面, 但是如果訪問 xmlns='http://maven.apache.org/POM/4.0.0'
中的 http://maven.apache.org/POM/4.0.0 就會得到一個(gè) PAGE NOT FOUND 錯(cuò)誤, 頁面未獲取到。
<project xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://maven.apache.org/POM/4.0.0' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd'>
1
2
細(xì)心的童鞋會注意到, project 元素前面并沒有前綴。 這里實(shí)際上使用的是默認(rèn)命名空間(default naming space)。 它的語法如下:
<elementName xmlns='namespaceURI'>
1
例如我們的 project 元素定義 和下面的例子
<table xmlns='http://www.w3.org/TR/html4/'> <tr><td>Apples</td><td>Bananas</td> </tr></table>
1
2
3
4
5
6
使用默認(rèn)命名空間的作用是, 該元素內(nèi)部的子元素都會默認(rèn)屬于該命名空間下, 我們不需要為他們一一添加命名空間前綴。
現(xiàn)在來看文件頭中剩下的, 看上去更為復(fù)雜的部分。
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd'
1
2
3
根據(jù)之前的知識我們可以理解, xmlns:xsi
定義了一個(gè)命名空間前綴 xsi
對應(yīng)的唯一字符串 http://www.w3.org/2001/XMLSchema-instance
。 但是讀者會發(fā)現(xiàn), 這個(gè) xmlns:xsi
在不同的 xml 文檔中似乎都會出現(xiàn)。 這是因?yàn)椋?nbsp;xsi
已經(jīng)成為了一個(gè)業(yè)界默認(rèn)的用于 XSD((XML Schema Definition) 文件的命名空間。 而 XSD 文件(也常常稱為 Schema 文件)是用來定義 xml 文檔結(jié)構(gòu)的。
注解: XML 解析器可以根據(jù) 一個(gè) XSD 文件的內(nèi)容來解析另一個(gè) XML 文件, 判斷該文件的結(jié)構(gòu)是否和 XSD 文件中定義的一致。 XSD 文件 可以理解為 XML 文檔可以自定義的語法或格式檢查器。
那么, 有了上述的理解, 再來看
xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd'
1
上面這行的語法其實(shí)是, xsi:schemaLocation = '鍵' “值”
即 xsi 命名空間下 schemaLocation 元素的值為一個(gè)由空格分開的鍵值對。
前一個(gè)“鍵” http://maven.apache.org/POM/4.0.0 指代 【命名空間】, 只是一個(gè)全局唯一字符串而已
后一個(gè)值指代 【XSD location URI】 , 這個(gè)值指示了前一個(gè)命名空間所對應(yīng)的 XSD 文件的位置, xml parser 可以利用這個(gè)信息獲取到 XSD 文件, 從而通過 XSD 文件對
所有屬于 命名空間 http://maven.apache.org/POM/4.0.0 的元素結(jié)構(gòu)進(jìn)行校驗(yàn), 因此這個(gè)值必然是可以訪問的, 且訪問到的內(nèi)容是一個(gè) XSD 文件的內(nèi)容