Maven引入外部依賴
您可能已經注意到我們一直在使用的POM中的依賴項元素。實際上,你一直都在使用外部依賴項,但這裡我們會詳細討論它的工作原理。
pom.xml
的dependencies
列表列出了我們的專案需要構建的所有外部依賴項(它是否需要在編譯時、測試時、執行時,或者其他什麼)。現在,我們的專案只依賴於JUnit(為了清楚起見,我把所有的資源過濾都去掉了):
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd" >
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url >
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
對於每個外部依賴項,您需要至少定義4個東西:groupId
artifactId
、version
和scope
。groupId
、artifactId
和version
都與pom.xml
中所提供的相同。用於構建該依賴項。scope元素指示您的專案如何使用該依賴項,並且可以是compile
、test
和runtime
時的值。
有了關於依賴關係的資訊,Maven將能夠在構建專案時引用依賴項。Maven從哪裡引用依賴關係?Maven在您的本地儲存庫中(${user.home}/.m2/repository
是預設的位置)以查詢所有的依賴項。在前一節中,我們將該工件從我們的專案(my-app-1.0-SNAPSHOT.jar
)安裝到本地儲存庫中。一旦它安裝在那裡,另一個專案就可以通過將依賴資訊新增到它的pom.xml
:將jar作為依賴項來引用。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>com.mycompany.app</groupId>
<artifactId>my-other-app</artifactId>
...
<dependencies>
...
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
每當專案引用本地儲存庫中不可用的依賴項時,Maven將從遠端儲存庫下載依賴項到本地儲存庫。當您構建第一個專案時,您可能注意到Maven下載了很多東西(這些下載是用於構建專案的各種外掛的依賴項)。預設情況下,遠端Maven儲存庫使用可以(瀏覽)在http://repo.maven.apache.org/maven2/
上找到。您還可以設定自己的遠端儲存庫(可能是公司的中心儲存庫),而不是使用預設的遠端儲存庫。有關儲存庫的更多資訊,您可以參考儲存庫的簡介。
讓我們為我們的專案新增另一個依賴項。假設我們已經在程式碼中添加了一些日誌記錄,並且需要將log4j
作為一個依賴項新增。首先,我們需要知道對於log4j
的groupId
、artifactId
和version
是什麼。我們可以在瀏覽器中搜索ibiblio
尋找它,或者使用谷歌搜尋“site:www.ibiblio.org maven2 log4j”。搜尋顯示一個目錄名為/maven2/log4j/log4j
(或/pub/packages/maven2/log4j/log4j
)。在該目錄中有一個名為maven-metadata.xml
的檔案。以下是log4j的maven-metadata.xml
看起來是這樣的:
<metadata>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.1.3</version>
<versioning>
<versions>
<version>1.1.3</version>
<version>1.2.4</version>
<version>1.2.5</version>
<version>1.2.6</version>
<version>1.2.7</version>
<version>1.2.8</version>
<version>1.2.11</version>
<version>1.2.9</version>
<version>1.2.12</version>
</versions>
</versioning>
</metadata>
從這個檔案中,我們可以看到我們想要的是“log4j
”,而artifactId
是“log4j
”。我們看到許多不同的版本值可供選擇;現在,我們將使用最新版本1.2.12(一些maven-metadata.xml
檔案還可以指定哪個版本是當前版本的版本)。在maven-metadata.xml
檔案,我們可以看到對應於log4j
庫的每個版本的目錄。在這些檔案中,我們將找到實際的jar檔案(例如:log4j-1.2.12.jar
)以及pom檔案(這是依賴項的pom.xml
,表示它可能擁有的任何進一步的依賴關係以及其他資訊)和另一個maven-metadata.xml
檔案。還有一個對應於這些檔案的md5檔案,其中包含了這些檔案的md5雜湊。您可以使用它來對庫進行身份驗證,或者找出您可能正在使用的某個特定庫的哪個版本。
現在我們已經知道了所需的資訊,我們可以將依賴項新增到我們的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
現在,當我們編譯這個專案(mvn compile
)時,我們將看到Maven下載log4j
依賴項。
詳細的程式碼可以參考下面的連結:
最後再貼上Maven依賴的範圍:
標籤名稱 | 標籤解釋 |
---|---|
compile | 這是預設範圍,如果沒有指定,就使用它。在所有類路徑中都可以使用編譯依賴項。此外,這些依賴關係被傳播到依賴的專案中。 |
provided | 這非常類似於編譯,但是表明您希望JDK或容器在執行時提供它。它只在編譯和測試類路徑中可用,且不具有傳遞性。 |
runtime | 這個範圍表明了對編譯的依賴不是必需的,而是用於執行。它在執行時和測試類路徑中,而不是編譯類路徑。 |
test | 該範圍表明,對應用程式的正常使用不需要依賴項,並且只適用於測試編譯和執行階段。它不傳遞。 |
system | 這個範圍類似於提供的,除非您必須提供明確地包含它的JAR。工件總是可用的,並且沒有在儲存庫中查詢。 |