進入 maven projects 界面
1. clean 清除之前的編譯文件
2. install 重新下載安裝 最新的jar包,
3. package 將項目 編譯 => 試運行 => 打包,(如果本模塊打包依賴有其它模塊,其它模塊如果有更新,打包報找不到依賴模塊的類時,先clean在install其它所依賴模塊或者直接在maven本地庫找到並刪除所依賴模塊的jar包,最后在重新package本模塊)
提示成功后,進入項目找到 target 文件夾
pom文件 的 packaging 標簽是war 就打成war包 是jar 就打成jar包
Maven是基於一個build lifecycle的中心概念,意味着構建和發布特定項目的過程是明確定義的。
對於人們構建一個項目,這意味着只需要學會少數命令來構建任意maven項目,然后pom會確保他們會得到他們想要的結果。
有三種內置的build lifecycle:default,clean,site。default生命周期處理項目的部署,clean生命周期處理項目的清理,site生命周期生成站點文檔。
Build Lifecycle由Phase組成
每種lifecycle由不同的一組phase組成,一個phase代表lifecycle的一個階段。
默認lifecycle執行的phase:
- validate:驗證項目的正確性以及包含所有必要的信息
- compile:編譯源碼
- test:編譯和運行測試代碼
- package:把編譯好的源碼打成包,如jar
- integration-test
- verify
- install:把項目安裝到本地倉庫中去,作為本地其他項目的依賴
- deploy:把最終的包拷貝到遠程倉庫上和其他開發者和項目分享(比如jekens會用到)
這些phase(包括沒有列出來的phase)會被順序地執行來完成default lifecycle。以上面的phase為例,這意味着當使用默認的lifecycle時,Maven會首先驗證項目,然后嘗試編譯源碼,運行測試,把二進制代碼打包(如jar包),對這些包運行集成測試,驗證集成測試,安裝驗證完的包到本地倉庫去,然后把安裝完的包部署到遠程倉庫。
Build Phase由Plugin Goal組成
盡管一個phase負責lifecycle的一個階段,但執行這些階段的方式可能會不同,這是通過把plugin goals綁定到phase上完成的。
一個goal代表着一個特定的任務(比phase粒度要細)用於構建和管理一個項目。goal可以綁定到0個到多個phase上,沒有綁定到phase上的goal可以在lifecycle外直接使用(如使用命令行)。goal的執行順序取決於其被調用的順序。 例如下面命令:
- 1
- 1
上面命令中,clean phase會首先被執行,然后執行dependency:copy-dependencies goal,最后執行package phase。
一個phase也可以有0個或多個綁定的goal,如果沒有goal綁定到它身上,它將不會被執行,如果有多個goal綁定,則會執行所有綁定的goal。
一些Phase通常不會從命令行直接調用
名字中帶有連字符的phase(如pre-,post-)通常不會從命令行直接調用。這些phase處理中間結果,通常不會在build lifecycle外執行。例如,直接調用integration-test,可能會出現異常。
代碼覆蓋工具如Jacoco 以及容器插件如Tomcat會綁定goal到pre-integration-test phase上來准備集成測試的容器環境,這些插件還會綁定goal到post-integration-test phase來收集代碼覆蓋數據或銷毀測試容器環境。
失效保護(Failsafe )和代碼覆蓋插件綁定goal到integration-test和verify phase上,結果就是在verify phase后可以得到測試和代碼覆蓋的報告。如果integration-test從命令行調用,不會有報告產生,更糟糕的情況是集成測試的環境可能停留在掛起的狀態。
設置項目使用的Build Lifecycle
build lifecycle使用起來很簡單,但在maven項目構建時,我們怎么給每個phase指定任務呢?
Packaging
首先我們可以通過packaging元素設置項目的打包方式來指定任務,maven支持的打包方式有:jar, war, ear 和 pom。如果不指定,默認為jar。
每種打包方式都包含了一系列的goal綁定到特定的phase上,例如,jar的打包方式會綁定下面的goal到default lifecycle的phase上:
- process-resources —— resources:resources
- compile —— compiler:compile
- process-test-resources —— resources:testResources
- test-compile —— compiler:testCompile
- test —— surefire:test
- package —— jar:jar
- install —— install:install
- deploy —— deploy:deploy
如上所示幾乎是標准的綁定,但一些打包方式會有所不同。例如,pom打包方式只給install和deploy phase綁定goal。完整的綁定列表可以參考Lifecycle Reference。
Plugin
第二中添加goal到phase上的方式是配置項目中的插件。插件是給Maven提供goal的artifact。另外,一個插件可能會有一個或多個goal,每個goal代表了這個插件的一種能力。例如Compiler插件有兩個goal:compile和testCompile,前面一個用來編譯main下的源碼,后面一個用來編譯test源碼。
插件可以把goal綁定到指定的phase上,要注意,把插件本身添加進來還不夠,必須指定哪些goal要作為我們構建項目的一部分。
如果有多個goal綁定到一個phase上,會先執行本來的goal,再執行pom中綁定到phase上的goal,也可以在executions標簽上指定goal的執行順。