我們在用maven構建java項目時,最常用的打包命令有mvn package、mvn install、mvn deploy,這三個命令都可完成打jar包或war(當然也可以是其它形式的包)的功能。
但這三個命令還是有區別的,可以從執行這三個命令的輸出結果來分析看,各自所執行的maven的生命周期不同。
通過執行這三個命令的輸出結果我們可以看出三者的區別在於包函的maven生命的階段和執行目標(goal)不同。
maven生命周期(Lifecycle)由各個階段組成,每個階段由maven的插件plugin來執行完成。
生命周期(Lifecycle)主要包括clean、resources、complie、install、pacakge、testResources、testCompile、deploy等,其中帶test開頭的都是用業編譯測試代碼或運行單元測試用例的。
仔細查看三個命令執行輸出的結果,可以發現,
- mvn clean package 依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7個階段。
- mvn clean install 依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等 8個階段。
- mvn clean deploy 依次執行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9個階段。
由上面的分析可知主要區別如下,
- package 命令完成了項目編譯、單元測試、打包功能,但沒有把打好的可執行jar包(war包或其它形式的包)布署到本地maven倉庫和遠程maven私服倉庫
- install 命令完成了項目編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)布署到本地maven倉庫,但沒有布署到遠程maven私服倉庫
- deploy 命令完成了項目編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)布署到本地maven倉庫和遠程maven私服倉庫
mvn clean install 與 mvn install 的區別
用mvn install后,新改的內容不生效,一定要使用mvn clean install 才生效
我們執行mvn install的時候會先執行mvn package,maven就是通過這個生命周期來根據用戶配置,進行打包(war、jar或者其他),這會在每個工程 pom.xml 文件中設置,類似如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ... <packaging>war</packaging> ... </project>
這里指定package的時候打成一個war包,改成jar,就會被打成jar包。
我們看jar形式的情況,mvn package 會調用 maven-jar-plugin 這個插件進行打包。
下面我們做一些實驗來看這個插件打包時的情況
- 1. 修改target目錄下打好的jar包中class以及配置文件的內容,在運行命令
mvn package,結果target包中的內容沒有被覆蓋。 - 2. 修改源代碼中的內容,再運行命令
mvn package,結果target包中的內容被覆蓋了,產生了新的包。 - 3. 修改target目錄下打好的jar包中的內容,運行命令
mvn package -Djar.forceCreation,這個參數應該是強制創建jar包,所以結果target中的jar包內容被覆蓋了,產生了新的jar包。
總結
- 1. jar包不存在(其實就是mvn clean的效果)
- 2. 理論上來講不做mvn clean 得到的jar包應該是最新的,除非其他方式修改jar包中的內容而不修改源代碼。
- 3. 平時可以用mvn install,而不進行chean節省時間(如果你覺得節省時間多的話),但最保險還是用 mvn clean install 生成最新的jar包或其他包
- 4. 不想用mvn clean又想保證jar包最新,建議添加
-Djar.forceCreation參數

