現在
運行jar目標並且看看Maven的輸出吧
它將包含下面如下這些
Attempting to download spring
core
jar
K downloadedAttempting to download spring
web
jar
K downloaded
圖
顯示了jar目標觸發的一系列事件
Maven查看POM
依據project
xml的定義
看到在springframework組中的兩個人造物的依賴關系
它將載你本地Maven的資源庫中檢查spring
core
jar和spring
web
jar
當Maven找不到這些文件
它將到尋找JAR文件
這些JAR文件會被下載並放置於你本地Maven的資源庫中
它們也被添加到你項目的classpath中
下次在你的項目查詢這些文件時
Maven將在你本地的資源庫中提供它們
圖Maven本地和遠程資源庫為test application項目提供的spring Jar 剛剛發生了什麼?
Maven為你節省了相當的時間和不必要的麻煩
Maven到來之前
依賴關系常常被捆綁到一個項目的目錄或者項目應該指向到添加正確的JAR到你的classpath
使用Maven管理依賴關系顯然有著明顯的優勢
作為初學者
如果你的項目依賴
個外部的JAR文件
這就不需要在你的資源庫中存儲成兆的JAR文件
這意味著當你在項目的外部檢查資源控制的時候更少的存儲空間和更快的下載時間
另外
如果你有多個項目依賴相同的外部依賴
Maven僅需要下載一次依賴關系
並且每個項目引用一個單獨的副本在你本地的資源庫中
當依賴關系能夠從Maven資源庫遠程下載的時候
沒有強制的原因讓你存儲你項目的依賴關系的版本
當Maven下載依賴關系
其在你本地的機器上從遠程的Maven資源庫拷貝一個文件到你本地的Maven資源庫
Maven如何定位依賴關系的?它使用project
xml中dependency元素的信息
如圖
所示
圖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>
提示
Maven
的說明中
資源庫可能開始於類似Java包的結構
作為springframework的替代
groupId被提議的結構為org
springframework
另外
每個版本將有一個分隔目錄用以增加Maven資源庫的效率
更多有關改變的提交建議
參見 MAVEN/Repository+Layout+
+Final
一個本地的資源庫來處理依賴關系
在Unix機器上
你的Maven資源庫能在~/
maven/repository目錄找到
在Windows機器上
你的Maven的資源庫在你的%USERPROFILE%目錄
如果你看一看本地Maven的資源庫
你將會注意到它正包含一個springframework的目錄
%USERPROFILE%\
maven\repository\springframework\jars目錄包含spring
core依賴關系的兩個
spring
core
jar文件和spring
core
jar
md
文件
其包含MD
文件用於驗證sprint
core JAR文件的完整性
Maven
當前並沒有使用MD
來驗證完成品的完整性
但在將來的版本可能會用其來驗證完成品的完整性
提示
在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的
版本
<
dependencies><
dependency><
id>commons
math<
/id><
version>
<
/version><
/dependency><
/dependencies>單獨使用id元素工作僅在groupId和artifactId匹配時
如果你浏覽Maven資源庫
你將看到下面的目錄結構
/commons
math
/jars
commons
math
jar
commons
math
jar
使用id元素工作
單獨的id標記已經不被贊成使用並在Maven
中消失
當你看到別的Maven項目中使用dependencies的速記符號時
請嘗試使用groupId和artifactId來標識你的依賴關系
依賴快照 如果你開發的程序依賴的依賴關系經常改變
你可能想將依賴的每個依賴關系替代為最近構件的硬編碼的版本
在一個項目依賴的依賴關系還處在beta的版本
或你正開發一系列項目依賴的Maven項目時時特別有用
這將在第
章論述
本實驗
你將學習到如何依靠快照
我該如何做?
在你的依賴關系塊兒中指定一個明確的版本
使用SNAPSHOT關鍵字作為版本名稱的一部分
每次你執行Maven目標時
Maven將從遠程資源庫中檢查較新的依賴關系
如果遠程資源庫的版本較新Maven將下載其到本地資源庫
例如
下面的依賴關系將一直下載spring的新版JAR文件
<dependency>
<groupId>springframework
</groupId>
<artifactId>spring
</artifactId>
<version>
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
The following commands are available:list
list all available goalshelp
this message<goalname>
attain a goalquit
quits the consoletest
application
>
目前
你可以在命令行執行任何你能執行的目標
開始是一下
鍵入 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
次
再在Maven Console下同樣運行java:compile
次
注意時間的差別
你將發現JVM啟動的時間開始增加
如果你找到你自己常用的Maven目標
Maven Console將通過啟動JVM一次為來節省時間
生成Eclipse項目 我打賭你一定想在IDE下工作
Maven通過插件來與Eclipse
InelliJ
IDEA
JBuilder
JDeveloper以及Emacs集成
Maven很好的與全部這些工作集成
本實驗關注
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28895.html