Maven自身指定定義了一套對項目進行編譯,測試,打包,運行,部署等工作的抽象。Maven自己是不實際負責這些工作的,而是把它們交給了插件。所以Maven命令的實際工作執行者是各種各樣的插件。
要了解Maven命令,還得知道Maven生命周期的概念。Maven有三套獨立的生命周期:clean, default和site。每個生命周期又有不同的階段。這三個生命周期之間是互相獨立的,調用一個不會影響另一個。但是生命周期內部各個階段之間卻是有前后依賴關系:必須先執行前面的階段,才可以執行下一階段。
clean生命周期的目的是清理項目,包含三個階段:
- pre-clean:
- clean:清理上一次構建生成的文件
- post-clean:
如果我現在要執行clean,那么必須先執行pre-clean。(只要告訴Maven你想要做的最后的目標就可以了,Maven會自動執行改目標之前的所有階段)
default生命周期定義了真正構建時所需要執行的所有步驟,有如下階段
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile
- process-test-classes
- test
- prepare-package
- package
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install
- deploy
好吧,default生命周期多了一點,還是一樣,如果想要執行deploy,那么Maven會自動把deploy前面所有的階段都執行一遍,但是永遠不會執行clean生命周期的任何東西。所以我們可以理解如這樣的命令:
mvn clean compile
意思是先執行到clean生命周期的clean階段,再執行到default生命周期的compile階段。
site生命周期的目的是建立和發布項目站點,有如下階段
- pre-site
- site
- post-site
- site-deploy
執行maven命令的最主要的方式就是調用Maven的生命周期的階段。再提一遍:Maven各個生命周期之間互相獨立,而每個生命周期內部是有前后依賴關系的。
插件及其目標
Maven的工作是插件完成的,插件自己也有自己的目的,並且還不是一個目的。以插件maven-dependency-plugin為例,它有十多個目標,如:dependency:list,dependency:analyze,dependency:tree等等。(這種寫法是一種通用的寫冒號前面是插件的前綴,后面是插件的目標)
Maven生命周期與插件目標互相綁定
例如項目編譯這個任務,對應maven default生命周期的compile階段。而maven-compiler-plugin有一個目標compile能夠完成這個任務。那么只要將他們綁定,就能夠完成任務了。
好了,那么我們應該執行命令: mvn compiler:compile來進行編譯了。可是那樣子得寫一段比較長的命令。還好maven有一些內置綁定,我們直接寫生命周期的某個階段,maven自己知道要調用哪個插件,執行到哪個目標。如下的內置綁定:
clean生命周期內只有一個階段有綁定: clean階段綁定了 maven-clean-plugin:clean。 那么我們寫mvn clean時,maven才知道要調用maven-clean-plugin:clean
site生命周期有兩個:site階段綁定maven-site-plugin:site ;site-deploy階段綁定maven-site-plugin:deploy
default生命周期比較復雜,還要根據打包類型來決定綁定那個插件的那個目標。
那么我們現在在回過頭來再看命令 mvn clean deploy ,就會后更深的解釋了:首先還是告訴maven,我要執行到clean階段,那么maven會找內置綁定,發現clean是與 maven-clean-plugin:clean綁定的,那么maven就會調用maven-clean-plugin:clean;接下來告訴maven,我要執行到deploy階段,還是一樣,maven發現該階段與maven-deploy-plugin:deploy綁定了,那么maven就會調用該插件了。
如果maven找不到綁定,那就會什么都不干。
如果你是個牛逼的程序員,覺得maven-clean-plugin這個插件寫的太挫了,自己寫了個插件,怎么使用呢?就是接下來的自定義綁定了。
自定義綁定
先寫個插件,那是必須的了。接下來在pom.xml文件中,build的子元素plugins中配置插件如下:
1 <plugin> 2 <groupId>org.apache.maven.plugins</groupId> 3 <artifactId>maven-source-plugin</artifactId> 4 <version>2.1.1</version> 5 <executions> 6 <execution> 7 <phase>verify</phase> 8 <goals> 9 <goal>jar-no-fork</goal> 10 </goals> 11 </execution> 12 </executions> 13 </plugin>
意思是 verify階段綁定到 maven-source-plugin:jar-no-fork目標。那么執行 mvn verify是就會執行 maven-source-plugin:jar-no-fork
命令行配置插件參數
mvn test -Dmaven.test.skip=true
記住 -Dxxx是java設置參數的方式。
到這里就該差不懂明白了,壓根就不需要記住所謂的maven常用命令。 用mvn 階段名 大體上能夠滿足編譯,測試的要求。
但是為了簡便,還是寫一下:
mvn clean compile 編譯
mvn clean test 測試
mvn clean package 打包
mvn clean install 把生成的jar/war包復制到本地repository(就是~/.m2/repository下面)
mvn clean deploy 把生成的jar/war包發送到遠程repository(建議配置了私服,那就是往私服發送了)
mvn cargo:run 通過cargo插件,把生成的war包部署到本地服務器,並啟動。(注意要先運行 mvn clean package 打包)
mvn cargo:redeploy 通過cargo插件,把生成的war包部署到遠程服務器:如果已經有了,就先undeploy再deploy,如果沒有直接deploy(注意要先運行 mvn clean package 打包,並且遠程服務器是啟動的)(怎么配置看Maven Cargo 遠程不是到tomcat7x)