MAVEN學習-2

1.多模塊企業級項目依賴

http://www.sonatype.com/book/mvn-examples-1.0.zip或者http://www.sonatype.com/book/mvn-examples-1.0.tar.gz。

2.優化依賴(父子項目、多子模塊相互依賴)

上移共同的依賴至 dependencyManagement如果多於一個項目依賴於一個特定的依賴,你可以在 dependencyManagement 中列出這個依賴。父POM包含一個版本和一組排除配置,所有的子POM需要使用 groupId 和 artifactId 引用這個依賴。如果依賴已經在 dependencyManagement 中列出,子項目可以忽略版本和排除配置。優化和重構POM為兄弟項目使用內置的項目version和groupId使用 {project.version} 和org.sonatype.mavenbook 來引用兄弟項目。兄弟項目基本上一直共享同樣的groupId,也基本上一直共享同樣的發佈版本。使用 0.6-SNAPSHOT 可以幫你避免前面提到的兄弟版本不一致問題。

3.Maven提供了三個隱式的變量,可以用來訪問環境變量,POM信息,和Maven Settings

env

env 變量 暴露了你操作系統或者shell的環境變量。例如,在Maven POM中一個對 /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/bin:/usr/local/bin:/usr/local/maven/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/java/latest/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin:/usr/local/bin 的引用將會被 /usr/local/bin:/usr/local/maven/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/java/latest/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin:/usr/local/bin 環境變量替換(或者Windows中的 %PATH% )。

project

project 變量暴露了POM。你可以使用點標記(.)的路徑來引用POM元素的值。例如,在本節中我們使用過 groupId 和 artifactId 來設置構建配置中的 finalName 元素。這個屬性引用的語法是: org.sonatype.mavenbook-${project.artifactId} 。

settings

settings 變量暴露了Maven settings信息。可以使用點標記(.)的路徑來引用 settings.xml 文件中元素的值。例如, ${settings.offline} 會引用 ~/.m2/settings.xml 文件中 offline 元素的值。

我們還可以通過 pom.xml 或者 settings.xml 中的 properties 元素設置自己的屬性,或者還可以使用外部載入的文件中屬性。如果你在 pom.xml 中設置了一個名為 fooBar 的屬性,該屬性就可以通過 ${fooBar} 引用。當你構建一個系統,它針對不同的部署環境過濾資源,那麼自定義屬性就變得十分有用。這裡是在POM中設置 ${foo}=bar 的語法:

bar

4.依賴範圍

org.apache.geronimo.specs

geronimo-servlet_2.4_spec

1.0

provided

provided定義;

項目依賴”簡要介紹了三種依賴範圍: compile , test ,和 provided 。範圍控制哪些依賴在哪些classpath中可用,哪些依賴包含在一個應用中

compile(編譯範圍)

compile 是默認的範圍;如果沒有提供一個範圍,那該依賴的範圍就是編譯範圍。編譯範圍依賴在所有的classpath中可用,同時它們也會被打包。

provided(已提供範圍)

provided 依賴只有在當JDK或者一個容器已提供該依賴之後才使用。例如,如果你開發了一個web應用,你可能在編譯classpath中需要可用的Servlet API來編譯一個servlet,但是你不會想要在打包好的WAR中包含這個Servlet API;這個Servlet API JAR由你的應用服務器或者servlet容器提供。已提供範圍的依賴在編譯classpath(不是運行時)可用。它們不是傳遞性的,也不會被打包。

runtime(運行時範圍)

runtime 依賴在運行和測試系統的時候需要,但在編譯的時候不需要。比如,你可能在編譯的時候只需要JDBC API JAR,而只有在運行的時候才需要JDBC驅動實現。

test(測試範圍)

test 範圍依賴 在一般的 編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用。測試範圍依賴在之前的???中介紹過。

system(系統範圍)

system 範圍依賴與 provided 類似,但是你必須顯式的提供一個對於本地系統中JAR文件的路徑。這麼做是為了允許基於本地對象編譯,而這些對象是系統類庫的一部分。這樣的構件應該是一直可用的,Maven也不會在倉庫中去尋找它。如果你將一個依賴範圍設置成系統範圍,你必須同時提供一個 systemPath 元素。注意該範圍是不推薦使用的(你應該一直儘量去從公共或定製的Maven倉庫中引用依賴)。

5. 可選依賴 true

比如某模塊

4.0.0

org.sonatype.mavenbook

my-project

1.0.0

net.sf.ehcache

ehcache

1.4.1

true 注意這兒

swarmcache

swarmcache

1.0RC2

true 注意這兒

另一個模塊

4.0.0

org.sonatype.mavenbook

my-application

1.0.0

org.sonatype.mavenbook

my-project 引用了上面一個模塊

1.0.0

net.sf.ehcache 聲明選擇了這個依賴

ehcache

1.4.1

也就是說當A模塊的某個jar設置可選依賴後,B模塊依賴了A模塊時想用ehcache jar 也得再次配置。默認為false

6.依賴版本界限

(, )

不包含量詞

[, ]

包含量詞

[3.8,4.0) 指定一個依賴界限: 3.8 - 4.0

[,3.8.1] 指定一個依賴界限: <= 3.8.1

在逗號前面或者後面的版本不是必須的,這種空缺意味著正無窮或者負無窮。

如果你指定[3.8.2],它意味只有3.8.2會被使用,沒有其它。如果其它什麼地方有一個版本指定了[3.8.1],你會得到一個構建失敗報告,告訴你有版本衝突。我指出這一點是要讓你知道有這一選項,但要保守的使用它,只有在確實需要的時候才使用。更好的做法是通過 dependencyManagement 來解決衝突。

7.傳遞性依賴和範圍

MAVEN學習-2

8. 依賴衝突解決


分享到:


相關文章: