《Maven權威指南》學習筆記(三)
-
構建生命週期
- Maven使用POM描述項目,將其建模成一些名詞.在Maven中這些“動詞”是由Maven插件包裝的一些目標,它們綁定到一個構建生命週期的階段中.當你讓Maven構建一個項目的時候,你其實是讓它一步步通過那些預定義的有序的階段,並且運行所有註冊到某個特定階段的目標
-
Maven中有三種標準的生命週期:清理(clean),默認(default)(有時候也稱爲構建),和站點(site)
-
清理生命週期 (clean):它包含了三個生命週期階段pre-clean,clean,post-clean
- 簡單的運行clean:clean目標不會完整的執行該生命週期,但是指定clean階段就能使用clean生命週期,並且逐個的經過生命週期階段,直到到達clean階段(可能未到post-clean階段就停了)
- 指定post-clean階段能經過完整的clean生命週期,直到post-clean階段.
- 直接運行pre-clean階段會提示:[INFO] No goals needed for project – skipping.可以在它的構建配置中,綁定了某個目標至pre-clean階段
- 可以自定義Clean插件的行爲去刪除構建輸出目錄以外的文件
- 默認生命週期 (default):它是一個軟件應用程序構建過程的總體模型。第一個階段是validate,最後一個階段是deploy
- 站點生命週期 (site):它包含了四個階段:1. pre-site 2. site 3. post-site 4. site-deploy 默認綁定到站點生命週期的目標是:1. site – site:site 2. site-deploy -site:deploy
-
在上述這些生命週期裏,如果某個生命週期階段沒有目標綁定在其上,運行該階段會提示[INFO] No goals needed for project – skipping
-
清理生命週期 (clean):它包含了三個生命週期階段pre-clean,clean,post-clean
-
打包相關生命週期
- 綁定到每個階段的特定目標默認根據項目的打包類型設置
-
JAR打包默認的目標生命週期階段 目標process-resources resources:resourcescompile compiler:compileprocess-test-resources resources:testResourcestest-compile compiler:testCompiletest surefire:testpackage jar:jarinstall install:installdeploy deploy:deploy
-
通用生命週期目標
-
Process Resources:
- 大部分生命週期將resources:resources目標綁定到process-resources階段.。process-resources階段處理資源並將資源複製到輸出目錄,同時也會在資源上應用過濾器,能讓你替換資源文件中的一些符號(而不是指pom.xml)
- 要配置使用該default.properties文件的資源過濾,我們需要在這個項目的POM中指定兩樣東西:構建配置的filters元素中的屬性文件列表,以及一個標記告訴Maven資源目錄需要過濾。默認的Maven行爲會跳過過濾,只是將資源複製到輸出目錄;你需要顯式的配置資源過濾,否則Maven就會置之不理
- 添加資源目錄列表<resource> <directory>src/main/images</directory> </resource>
- 也可以聲明兩個資源目錄,給它們提供不同的過濾配置和目標目錄配置
-
Compile:
- 大部分生命週期將Compiler插件的compile目標綁定到compile階段
- 可以爲Compiler插件設置source和target版本
- 如果你想要存儲項目的源碼至src/java而非src/main/java,讓構建輸出至classes而非target/classes,你可以覆蓋定義在超級POM中的sourceDirectory的默認值
- Process Test Resources: 調用resources:testResources
- Test Compile:調用compile:testCompile編譯測試源代碼目錄至測試構建構建輸出目錄
-
Test:大部分生命週期綁定Surefire插件的test目標至test階段
- maven.test.skip變量同時控制Compiler和Surefire插件,如果你傳入maven.test.skip,就等於告訴Maven整個的跳過測試
- Install:Install插件的install目標基本上都是綁定到install生命週期階段。install:install目標只不過是將項目的主要構件安裝到本地倉庫,如果這個項目的打包類型是POM,那麼該目標就僅僅複製POM到本地倉庫
- Deploy:Deploy插件的deploy目標通常綁定到deploy生命週期階段。該階段用來將一個構件部署到遠程Maven倉庫,當你執行一次發佈的時候通常需要更新遠程倉庫
-
Process Resources:
- 第11章 構建Profile 和 第12章 Maven套件 先跳過不看(profile能解決產品環境和開發環境數據庫地址不同的問題)
-
屬性和資源過濾
-
屬性
- 你可以在pom.xml文件或者資源文件中使用屬性,資源文件被會Maven Resource插件的過濾特性處理
- 隱式的屬性:project.*,settings.*env.*,Java系統屬性
-
Maven項目的屬性:
- 任何在Maven POM 中的東西都可以用屬性來引用(project.groupId 和 project.version)
-
如果你試圖在Maven中引用輸出目錄,你絕不應該使用如target/classes的字面量,而是應該使用屬性來引用這些目錄(project.build.*)
- 關於Maven Model對象可用屬性的完整列表(關於model對象的屬性還不是很清楚,應該是諸如model.*)
- Maven的Settings屬性
- 環境變量屬性
- Java系統屬性:任何你能從System.getProperty()獲取的屬性都能以Maven屬性的形式引用,如:java.version
-
用戶定義的屬性:
- 用戶定義的屬性可以在POM中引用,也可以由Maven Resource插件用來過濾資源
-
資源過濾:
- 你可以使用Maven來對項目資源進行變量替換。在資源過濾被激活的時候,Maven會掃描資源,尋找由${ 和}包圍的Maven屬性的引用。一旦它找到這些引用,它就會使用合適的值去替換它們,就像前一節中定義的屬性可以在POM中引用一樣
- 該節和profile有點關聯,因爲第11章未看,理解不夠深.
-
屬性
- 第 14 章 Maven和Eclipse: m2eclipse 沒有IDE,跳過
- 第15章及其以後的章節都先跳過.
- 附錄A稍微過了一遍.附錄B沒看.
要點:
- Maven 不知道如何打包 WAR 文件,也不知道如何運行單元測試,Maven大部分的智能是由插件實現的,而插件從 Maven 倉庫獲得.當你下載Maven的時候,你得到的是一個包含了基本軀殼的Maven核心,它知道如何解析命令行,管理classpath,解析POM文件,在需要的時候下載Maven插件
- conf/ 目錄包含了一個全局的settings.xml文件,該文件用來自定義你機器上Maven的一些行爲。如果你需要自定義Maven,更通常的做法是覆寫~/.m2目錄下的settings.xml文件,每個用戶都有對應的這個目錄
-
當Maven運行一個目標的時候,每個目標都會訪問定義在項目POM裏的信息
- 在一個Java項目中,Java類放在src/main/java下面,而classpath資源文件放在src/main/resources下面
- Maven自帶了一個用來下載Maven核心插件和依賴的遠程倉庫地址(http://repo1.maven.org/maven2)
- Maven倉庫的標準是按照下面的目錄格式來存儲構件,相對於倉庫的根目錄:/<groupId>/<artifactId>/<version>/<artifactId>-<version>.<packaging>
- 一旦Maven已經從遠程倉庫下載了一個構件,它將永遠不需要再下載一次,因爲maven會首先在本地倉庫查找插件,然後纔是其它地方
- 它支持了傳遞性依賴(transitive dependencies),Maven會隱式的把這些庫間接依賴的庫也加入到你的項目中.
- 添加一些關於項目許可證,組織以及項目相關開發人員的一些信息.,licenses,organization 和 developers 等元素
- 一個插件目標也被認爲是一個 “Mojo”
-
開啓調試輸出允許你看到Maven 工作時的依賴機制,查看完整的依賴蹤跡: mvn install -X
- 學習如何瀏覽郵件列表
- artifact:人工製品;手工藝品;加工品
- archetype:原型
- snapshot:快照
問題:
- 在向create目標傳入了packageName參數,與不傳入沒什麼區別,生成的pom.xml沒有變化,最後打包的名稱也沒有不同.
- 一開始構建前將conf/setting.xml下的repository地址改過後,將不會生成默認的~/.m2文件夾,而且針對每個用戶的配置文件~/.m2/setting.xml也沒有生成.