1. 程式人生 > 實用技巧 >Maven 命令列打包 和 pom.xml的常用配置

Maven 命令列打包 和 pom.xml的常用配置

maven 命令列打包

mvn -v, --show-version

mvn -h, --help

使用 help 命令可以看到 maven 命令的幫助文件,下面主要介紹兩個常用的指令 —— D 和 P

mvn -D, --define <arg>

mvn -DpropertyName=propertyValue clean package可以用來臨時定義屬性和值。如果 pom.xml 中已經有該屬性,那麼會替換掉 pom.xml 中的值。

如果需要定義多個變數,可以用空格分隔
mvn -DpropA=valueA -DpropB=valueB -DpropC=valueC clean package

當然這個屬性也可以直接在 pom.xml 檔案下配置

mvn -P, --activate-profiles <arg>

P 表示 Profiles 配置檔案,需要在 <profile> 標籤中指定 <id> 才能用 -P 使之生效。

假如 pom.xml 如下

mvn引數-N、-U理解

    1. 關於-N

      -N,--non-recursive Do not recurse into sub-projects

      意思是,不遞迴到子專案(子模組)。

      舉例:

      一個父專案下Father面有3個子專案A、B、C,都生成jar包,則有Father.jar、A.jar、B.jar、C.jar;
      這個時候A專案依賴了B、C專案。

      此時如果使用mvn clean install -N,則只會把Father.jar安裝到本地倉庫(~/.m2/repository),
      而不會安裝其他三個包

      造成的問題是,如果你此時使用如下命令拷貝依賴包,則會報錯:說找不到依賴包B.jar/C.jar

      mvn dependency:copy-dependencies -DoutputDirectory=$WORKSPACE/dependencies
      
    2. 關於-U

      -U,--update-snapshots Forces a check for missing releases
      and updated snapshots on remote repositories

      意思是:強制重新整理本地倉庫不存在release版和所有的snapshots版本。

      • 對於release版本,本地已經存在,則不會重複下載
      • 對於snapshots版本,不管本地是否存在,都會強制重新整理,但是重新整理並不意味著把jar重新下載一遍。
        只下載幾個比較小的檔案,通過這幾個小檔案確定本地和遠端倉庫的版本是否一致,再決定是否下載

那麼打包時執行mvn clean package -P prod將只啟用 prod 環境的 profile 配置(也就是說此時 test 和 dev 的配置不會生效)

mvn package 與 mvn install 的區別

mvn 打包外掛的執行順序

我這裡用的是 maven 3.1.1 打包 android 專案

實戰

案例一

使用 mvn 打包,並跳過測試,然後生成文件,使用 dev 配置

案例二

將模組A生成的 jar,複製到模組B的 libs 目錄下。
安裝模組到 maven 倉庫。

預設情況下,cmd 的命令發起呼叫後就立即返回了。而 CALL 是一個呼叫外部批處理程式的指令,類似於函式呼叫的執行邏輯,它會一直等到函式執行結束才返回

pom.xml的常用配置

denpendencyManagement 與 pluginManagement

denpendencyManagement是用於管理專案jar包依賴,pluginManagement是用於管理plugin。
它們的作用是列出依賴的jar包或者plugin包,讓子pom來決定是否引用。

對不同的配置賦予不同的屬性

activation 元素用來指定啟用條件。當沒有指定條件,然後指定 activeByDefault 為 true 的時候,就表示沒有指明 profile 的情況下預設啟用。也就是說mvn package將使用 dev 的配置,而mvn package -P prod的時候使用的才是 prod 的配置。

根據不同配置使用不同的原始檔

然後在 profiles/dev 目錄下新建 java 檔案

執行打包命令mvn clean package -DskipTests -Pdev,就可以看到 /profiles/dev 目錄下的 java 檔案全部被複制到了 /src/com/companyName/global 目錄下了,並且 isDebugEnable 的值也被替換了。

配置項說明:

  • parse 用來指明具體在 maven 的哪個生命週期執行該任務

maven 的生命週期表

  • inherited 用來指明 execution 是否傳遞到子 pom.xml 裡
  • filtering屬性用來表示資原始檔中的 “EL表示式佔位符” 是否需要被替換,true為需要替換