天天看點

《Maven官方文檔》-Maven依賴機制簡介(二)

項目b:

<project> <modelversion>4.0.0</modelversion> <groupid>maven</groupid> <artifactid>b</artifactid> <packaging>pom</packaging> <name>b</name> <version>1.0</version> <dependencymanagement> <dependencies> <dependency> <artifactid>a</artifactid> <type>pom</type> <scope>import</scope> </dependency> <groupid>test</groupid> <artifactid>d</artifactid> </dependencies> </dependencymanagement> <scope>runtime</scope> <artifactid>c</artifactid> </project>

假設a就是上一個例子中定義的pom,那麼最終的結果也是一緻的。除了在b中定義的d子產品,所有a的管理依賴都會導入到b中。

項目x:

<artifactid>x</artifactid> <name>x</name> <version>1.1</version> <scope>compile</scope>

項目y:

<artifactid>y</artifactid> <name>y</name> <version>1.2</version>

項目z:

<artifactid>z</artifactid> <name>z</name>

在上面的例子中,z導入了x和y的管理依賴。不過有個問題,x和y都包含了依賴a。在這裡,會使用1.1版本的a,因為x先被聲明,并且a沒有在z的依賴管理中聲明。

這個過程是遞歸進行的。假如x導入了另外的pom,q,那麼當解析z的時候,所有q的管理依賴看上去就都像在x中定義的一樣。

當定義一個用于建構多項目的包含一些相關構件的依賴“庫”時,導入依賴就十分有效。從“庫”中引用一個或多個構件到項目中,是一種很常見的做法。然而,

保持項目中使用的依賴版本與庫中釋出的版本一緻會有點麻煩。下面的模式描述了怎麼生成一個供其它項目使用的“物料清單”(bom)。

項目的根元素是bom pom檔案。它定義了庫中建立的所有構件版本。其它要使用該庫的項目必須将該pom導入到其pom檔案中的<dependencymanagement>元素中。

<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.test</groupid> <artifactid>bom</artifactid> <version>1.0.0</version> <properties> <project1version>1.0.0</project1version> <project2version>1.0.0</project2version> </properties> <artifactid>project1</artifactid> <version>${project1version}</version> <artifactid>project2</artifactid> <modules> <module>parent</module> </modules>

parent子項目将bom pom作為它的父項目。這是一個簡單的多項目pom。

接下來是真正的pom檔案。

<parent> <artifactid>parent</artifactid> </parent> <packaging>jar</packaging> <groupid>log4j</groupid> <artifactid>log4j</artifactid> <version>${project2version}</version> <groupid>commons-logging</groupid> <artifactid>commons-logging</artifactid>

下面的例子說明了怎麼在項目中使用“庫”,而不必指定依賴子產品的版本。

<artifactid>use</artifactid>

最後,當建立引入依賴的項目時,需要注意以下幾點:

不要嘗試引入在目前pom中定義的子子產品pom。那會導緻不能定位pom和編譯失敗。

 絕不要聲明導入其他pom作為目标pom的父項目(或者祖父項目等)的pom檔案。這會導緻循環解析,并觸發異常。

 當引用有傳遞性依賴的子產品時,需要指定依賴子產品的版本。不這樣做,這些子產品可能沒有确定的版本,進而導緻編譯失敗。(這在任何情況下都應該是一個最佳實踐,因為它保證了子產品版本的不變性)

系統範圍的依賴應該是一直可用,并且maven不會去倉庫中查找。系統範圍依賴通常是指jdk或者vm提供的依賴。是以,系統依賴适用于這種情況:以前可以單獨擷取,但現在是由jdk提供的依賴。典型的例子就是jdbc标準擴充或者java認證和授權服務(jaas)。一個簡單的例子如下:

… <groupid>javax.sql</groupid> <artifactid>jdbc-stdext</artifactid> <version>2.0</version> <scope>system</scope> <systempath>${java.home}/lib/rt.jar</systempath>

如果你的構件依賴于jdk的tools.jar,那麼系統路徑的值如下所示:

<groupid>sun.jdk</groupid> <artifactid>tools</artifactid> <version>1.5.0</version> <systempath>${java.home}/../lib/tools.jar</systempath>