1. 程式人生 > >Maven引入外部依賴

Maven引入外部依賴

  您可能已經注意到我們一直在使用的POM中的依賴項元素。實際上,你一直都在使用外部依賴項,但這裡我們會詳細討論它的工作原理。

  pom.xmldependencies列表列出了我們的專案需要構建的所有外部依賴項(它是否需要在編譯時、測試時、執行時,或者其他什麼)。現在,我們的專案只依賴於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

artifactIdversionscopegroupIdartifactIdversion都與pom.xml中所提供的相同。用於構建該依賴項。scope元素指示您的專案如何使用該依賴項,並且可以是compiletestruntime時的值。

  有了關於依賴關係的資訊,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作為一個依賴項新增。首先,我們需要知道對於log4jgroupIdartifactIdversion是什麼。我們可以在瀏覽器中搜索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。工件總是可用的,並且沒有在儲存庫中查詢。