Attempting to download
spring-core-1.1.4.jar.266K downloadedAttempting to download
spring-web-1.1.4.jar.111K downloaded
圖1-1顯示了jar目標觸發的一系列事件:
1.Maven查看POM,依據project.
xml的定義,看到在
springframework組中的兩個人造物的依賴關系。它將載你本地Maven的資源庫中檢查
spring-core-1.1.4.jar和
spring-web-1.1.4.jar。
2.當Maven找不到這些文件,它將到http://www.ibiblio.org/
maven/
springframework/jars/尋找JAR文件。這些JAR文件會被下載并放置于你本地Maven的資源庫中。它們也被添加到你項目的classpath中。下次在你的項目查詢這些文件時,Maven將在你本地的資源庫中提供它們。
圖1-1.Maven本地和遠程資源庫為test application項目提供的spring Jar 剛剛發生了什么?
Maven為你節省了相當的時間和不必要的麻煩。Maven到來之前,依賴關系常常被捆綁到一個項目的目錄或者項目應該指向到添加正確的JAR到你的classpath。使用Maven管理依賴關系顯然有著明顯的優勢;作為初學者,如果你的項目依賴30個外部的JAR文件,這就不需要在你的資源庫中存儲成兆的JAR文件。這意味著當你在項目的外部檢查資源控制的時候更少的存儲空間和更快的下載時間。另外,如果你有多個項目依賴相同的外部依賴,Maven僅需要下載一次依賴關系,并且每個項目引用一個單獨的副本在你本地的資源庫中。當依賴關系能夠從Maven資源庫遠程下載的時候,沒有強制的原因讓你存儲你項目的依賴關系的版本。
當Maven下載依賴關系,其在你本地的機器上從遠程的Maven資源庫拷貝一個文件到你本地的Maven資源庫。Maven如何定位依賴關系的?它使用project.
xml中dependency元素的信息,如圖1-2所示。
圖1-2.POM和Maven資源庫的映射 指定的groupId告訴Maven查看特定的目錄-
springframework。指定type告訴Maven查找特定的子目錄如jar和war(注意s是Maven附加到type元素上的);本例中,type是被忽略的,JAR類型是默認類型。當你指定了artifactId,你正告訴Maven哪個文件將從jar目錄下載。頂級目錄表現為組標示符,JAR文件名的第一部分表現為artifact標示符,文件名最后的部分,包括擴展名表現為version標示符。Maven使用下面的公式來決定一個來自于資源庫中的依賴關系。[REPO_ROOT]參考你遠程的資源庫:
[REPO_ROOT]/<groupId>/<type>s/<artifactId>-<currentVersion>.<type>
提示
Maven2.0的說明中,資源庫可能開始于類似Java包的結構。作為
springframework的替代,groupId被提議的結構為org.
springframework.另外,每個版本將有一個分隔目錄用以增加Maven資源庫的效率。更多有關改變的提交建議,參見http://docs.codehaus.org/display/ MAVEN/Repository+Layout+-+Final.
一個本地的資源庫來處理依賴關系。在Unix機器上,你的Maven資源庫能在~/.
maven/repository目錄找到,在Windows機器上,你的Maven的資源庫在你的%USERPROFILE%目錄。如果你看一看本地Maven的資源庫,你將會注意到它正包含一個
springframework的目錄。%USERPROFILE%\.
maven\repository\
springframework\jars目錄包含
spring-core依賴關系的兩個:
spring-core-1.1.4.jar文件和
spring-core-1.1.4.jar.md5文件,其包含MD5文件用于驗證sprint-core JAR文件的完整性。Maven 1當前并沒有使用MD5來驗證完成品的完整性,但在將來的版本可能會用其來驗證完成品的完整性。
提示
在Windows機器上,%USERPROFILE%通常決定于C:\D-ocuments and Settings\vmassol這種目錄。%USERPR-OFILE%被用在Unix的主目錄。(%USERPROFILE% isused in the spirit of the abbreviation for a Unix home directory.)
關于......使用id元素?
如果你工作在現存的Maven項目,你可能有依賴關系使用id元素。下面的dependencies元素示范了使用單獨id元素來附加Jakarta Commons Math的1.0版本:<;dependencies><;dependency><;id>commons-math<;/id><;version>1.0<;/version><;/dependency><;/dependencies>單獨使用id元素工作僅在groupId和artifactId匹配時,如果你瀏覽Maven資源庫,你將看到下面的目錄結構:
/commons-math
/jars
commons-math-1.0.jar
commons-math-1.1.jar
使用id元素工作,單獨的id標記已經不被贊成使用并在Maven 2中消失。當你看到別的Maven項目中使用dependencies的速記符號時,請嘗試使用groupId和artifactId來標識你的依賴關系。
依賴快照 如果你開發的程序依賴的依賴關系經常改變,你可能想將依賴的每個依賴關系替代為最近構件的硬編碼的版本。在一個項目依賴的依賴關系還處在beta的版本,或你正開發一系列項目依賴的Maven項目時時特別有用,這將在第3章論述。本實驗,你將學習到如何依靠快照。
我該如何做?
在你的依賴關系塊兒中指定一個明確的版本,使用SNAPSHOT關鍵字作為版本名稱的一部分。每次你執行Maven目標時,Maven將從遠程資源庫中檢查較新的依賴關系。如果遠程資源庫的版本較新Maven將下載其到本地資源庫。例如:下面的依賴關系將一直下載
spring的新版JAR文件。
<dependency>
<groupId>
springframework
</groupId>
<artifactId>
spring </artifactId>
<version>1.2-SNAPSHOT
</version>
</dependency>
剛剛發生了什么?
當你使用SNAPSHOT依賴關系,你正告訴Maven使用遠程資源庫的最新版本。在你使用多項目插件或者當你依賴的一個完成品尚處于開發階段這將得心應手。在你工作的團隊僅有較少的開發者組成時,最好也常這么做。你將使用SNAPSHOT依賴關系當你的項目依賴一個最近的開發或者非正式版本的特別組件。SNAPSHOT依賴關系應該在開發階段被保留,并且,概括說,你不用改發布一個依賴于SNAPSHOT依賴關系的項目。
執行脫機構建 如果你需要在一個離線的情況下使用Maven,你可能需要知道如何確使Maven不檢查最新的SNAPSHOT依賴關系。本實驗將向你展示如何用Maven執行脫機構建。
我該如何做?
這個方法很簡單:僅僅使用-o命令行選項。例如,如果你沒有網絡連接,但又想執行測試目標,運行Maven -o test。Maven將執行這個test目標而不檢查依賴關系。如果你的項目沒有依賴SNAPSHOT構建,你也可以斷看你的環境來添加-o標志。如果你依賴SNAPSHOT構建,你將需要使用-o標志,Maven將在每次執行目標時嘗試檢查最新的SNAPSHOT。在這種情況下不使用-o標志本項目將不會構建成功。
關于...... 執行離線構建如果你不想下載任何完成品?
當然,這將不會工作。離線構建的工作,你必須已經有必需的依賴關系在你本地的資源庫。項目最簡單的獲得Maven下載依賴
關系的方法是在每個Maven項目實例簡單的運行“noop”目標,build:start。這個目標執行之前任何其它的目標并不執行任何動作。如果你運行build:start,Maven將從project.
xml獲得獲取任何依賴關系。
使用Maven控制臺 如果你再三的從命令行運行Maven,你可以通過Maven控制臺來節省時間。Maven控制臺提供一個“外殼”,在這你可以鍵入目標的名稱來執行Maven。通過使用Maven可以避免每次載你想運行一個Maven目標時Java Virtual Machine(JVM)啟動的等待。
我該如何做?
Maven Console是一個插件,你可以通過鍵入
maven console在命令提示符。這將產生下面的輸出:
__ __
| \/ |__ _Apache__ ___
| |\/| / _` \ V / -_) ' \ ~ intelligent projects ~
|_| |_\__,_|\_/\___|_||_| v. 1.0.2The following commands are available:list - list all available goalshelp - this message<goalname> - attain a goalquit - quits the consoletest-application 1.0 >
目前,你可以在命令行執行任何你能執行的目標。開始是一下;鍵入 java:compile。Maven將執行 java:compile目標并返回提示符其它的目標。在一個序列中運行兩個目標,你可以在提示符處輸入它們,通過“空格”-例如, clean test。眾所周知作為“goal chaining”這是你想通過Maven獲得指定一系列目標的方法。退出Maven Console,鍵入quit,查看有效目標列表,鍵入list。
剛剛發生了什么?
在Maven Console下Maven執行java:compile目標非常之快,不信么?當你使用Maven Console時你所執行的目標是在一個現成的JVM下。當你從命令行運行Maven時,你每次運行一個目標都不得不等待JVM的啟動。如果你不確信其對性能的提升,自己試試看。在命令行下運行java:complie 10次,再在Maven Console下同樣運行java:compile 10次。注意時間的差別,你將發現JVM啟動的時間開始增加。如果你找到你自己常用的Maven目標,Maven Console將通過啟動JVM一次為來節省時間。
生成Eclipse項目 我打賭你一定想在IDE下工作。Maven通過插件來與Eclipse,InelliJ,IDEA,JBuilder,JDeveloper以及Emacs集成。Maven很好的與全部這些工作集成,本實驗關注
請記住本文永久地址:
http://www.javaresource.org/maven/maven-73941.html或
Maven起步――教你開始使用Maven二(圖)Java資源網收集整理,轉載請保留出處.
posted on 2007-02-12 12:22
小石頭 閱讀(508)
評論(0) 編輯 收藏 所屬分類:
maven、ant