1. 程式人生 > >maven的常用命令與多模組專案構建

maven的常用命令與多模組專案構建

      本節介紹幾個maven常用的命令,以備遺忘時可以檢視。

mvn -version                 檢視maven的版本及配置資訊

mvn archetype:create   -DgroupId=    DartifactId=    構建java專案

mvn archetype:create   -DgroupId=    DartifactId=    -DarchetypeArtifactId=maven-archetype-webapp 建立web專案

mvn compile                編譯專案程式碼

mvn package               打包專案

mvn package -Dmaven.test.skip=true   打包專案時跳過單元測試

mvn test                      執行單元測試

mvn clean                    清除編譯產生的target資料夾內容,可以配合相應命令一起使用,如mvn clean package, mvn clean test

mvn install                   打包後將其安裝在本地倉庫

mvn deploy                  打包後將其安裝到pom檔案中配置的遠端倉庫

mvn eclipse:eclipse      將maven生成eclipse專案結構

mvn eclipse:clean         清除maven專案中eclipse的專案結構

mvn site                       生成站點目錄

mvn dependency:list      顯示所有已經解析的所有依賴

mvn dependency:tree     以樹的結構展示專案中的依賴

mvn dependency:analyze  對專案中的依賴進行分析,依賴未使用,使用單未引入

mvn dependency:analyze -DfailOnWarning=true  對專案中的依賴進行分析,未使用的依賴項或未宣告的已使用依賴項時,輸出中都會顯示警告

跳過測試的執行:你可以用mvn package -DskipTests=true。或者,您可以將該屬性縮短為-DskipTests.

跳過測試的編譯和執行(不建議):你可以用mvn package -Dmaven.test.skip=true。你可以把財產縮短到-Dmaven.test.skip.

除錯單元測試:你可以用mvn package -Dmaven.surefire.debug.

除錯整合測試:你可以用mvn package -Dmaven.failsafe.debug.

mvn tomcat:run              啟動tomcat

mvn clean install        構建專案

mvn clean dependency:copy-dependencies package    清理和打包

處理並顯示清理生命週期的所有階段: mvn post-clean

介紹

POM代表專案物件模型。它是 Maven 中工作的基本單位,這是一個 XML 檔案。它始終儲存在該專案基本目錄中的 pom.xml 檔案。
POM 包含的專案是使用 Maven 來構建的,它用來包含各種配置資訊。
POM 也包含了目標和外掛。在執行任務或目標時,Maven 會使用當前目錄中的 POM。它讀取POM得到所需要的配置資訊,然後執行目標。部分的配置可以在 POM 使用如下:

  • project dependencies
  • plugins
  • goals
  • build profiles
  • project version
  • developers
  • mailing list

建立一個POM之前,應該要先決定專案組(groupId),它的名字(artifactId)和版本,因為這些屬性在專案倉庫是唯一標識的。

POM的例子

<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">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.yiibai.project-group</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>
<project>

XML

要注意的是,每個專案只有一個POM檔案。

  • 所有的 POM 檔案要專案元素必須有三個必填欄位: groupIdartifactIdversion
  • 在庫中的專案符號是:groupId:artifactId:version
  • pom.xml 的根元素是 project,它有三個主要的子節點。
節點 描述
groupId 這是專案組的編號,這在組織或專案中通常是獨一無二的。 例如,一家銀行集團com.company.bank擁有所有銀行相關專案。
artifactId 這是專案的ID。這通常是專案的名稱。 例如,consumer-banking。 除了groupId之外,artifactId還定義了artifact在儲存庫中的位置。
version 這是專案的版本。與groupId一起使用,artifact在儲存庫中用於將版本彼此分離。 例如:com.company.bank:consumer-banking:1.0com.company.bank:consumer-banking:1.1

超級POM

所有的POM繼承自父類(儘管明確界定)。這個基礎的 POM 被稱為超級 POM,幷包含繼承預設值。 Maven使用有效的POM(超級POM加專案配置的配置)執行有關目標。它可以幫助開發人員指定最低配置的詳細資訊寫在 pom.xml 中。雖然配置可以很容易被覆蓋。 一個簡單的方法來看看超級POM的預設配置,通過執行下面的命令:mvn help:effective-pom 建立一個 pom.xml 。 在下面的例子中,已經建立了一個 pom.xmlC:\MVN\ 專案資料夾中。 現在,開啟命令控制檯,進入包含 pom.xml 資料夾並執行以下 mvn 命令。

C:\MVN\project> mvn help:effective-pom

Maven將開始處理,並顯示有效的 effective-pom 。

[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'help'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.project-group:project-name:jar:1.0
[INFO]    task-segment: [help:effective-pom] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [help:effective-pom {execution: default-cli}]
[INFO]

.....

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Thu Jul 05 11:41:51 IST 2012
[INFO] Final Memory: 6M/15M
[INFO] ------------------------------------------------------------------------

在控制檯顯示結果:有效POM,繼承,插值,應用配置檔案。

生命週期

構建生命週期階段的目標是執行順序是一個良好定義的序列。
這裡使用一個例子,一個典型的 Maven 構建生命週期是由下列順序的階段:

階段 處理 描述
準備資源 資源複製 資源複製可以進行定製
編譯 執行編譯 原始碼編譯在此階段完成
包裝 打包 建立JAR/WAR包如在 pom.xml 中定義提及的包
安裝 安裝 這一階段在本地/遠端Maven倉庫安裝程式包

預設(或生成)生命週期

這是 Maven 主要的生命週期,用於構建應用程式。它有以下 23 個階段。

生命週期階段 描述
validate 驗證專案是否正確,並且所有必要的資訊可用於完成構建過程
initialize 建立初始化狀態,例如設定屬性
generate-sources 產生任何的原始碼包含在編譯階段
process-sources 處理原始碼,例如,過濾器值
generate-resources 包含在包中產生的資源
process-resources 複製和處理資源到目標目錄,準備打包階段
compile 編譯該專案的原始碼
process-classes 從編譯生成的檔案提交處理,例如:Java類的位元組碼增強/優化
generate-test-sources 生成任何測試的原始碼包含在編譯階段
process-test-sources 處理測試原始碼,例如,過濾器任何值
test-compile 編譯測試原始碼到測試目標目錄
process-test-classes 處理測試程式碼檔案編譯生成的檔案
test 執行測試使用合適的單元測試框架(JUnit)
prepare-package 執行必要的任何操作的實際打包之前準備一個包
package 提取編譯後的程式碼,並在其分發格式打包,如JAR,WAR或EAR檔案
pre-integration-test 完成執行整合測試之前所需操作。例如,設定所需的環境
integration-test 處理並在必要時部署軟體包到整合測試可以執行的環境
pre-integration-test 完成整合測試已全部執行後所需操作。例如,清理環境
verify 執行任何檢查,驗證包是有效的,符合質量稽核規定
install 將包安裝到本地儲存庫,它可以用作當地其他專案的依賴
deploy 複製最終的包到遠端倉庫與其他開發者和專案共享

有涉及到Maven 生命週期值得一提幾個重要概念:

  • 當一個階段是通過 Maven命令呼叫,例如:mvn compile,只有階段到達幷包括這個階段才會被執行。

  • 不同的 Maven 目標繫結到 Maven生命週期的不同階段這是這取決於包型別(JAR/WAR/EAR)。 

 

Maven多模組專案

  Maven多模組專案,適用於一些比較大的專案,通過合理的模組拆分,實現程式碼的複用,便於維護和管理。尤其是一些開源框架,也是採用多模組的方式,提供外掛整合,使用者可以根據需要配置指定的模組。

  專案結構如下:

      test-hd-parent   (父級)
             ---pom.xml
             ---test-hd-api          (第三方介面層)
                    ----pom.xml    
           ---test-hd-foundation     (基礎工具層)
                    ----pom.xml
             ---test-hd-resource     (資源層) 
                    ----pom.xml
             ---test-hd-service       (邏輯業務層)
                    ----pom.xml
           ---test-hd-modules     (web層)
                    ----pom.xml
                ---test-hd-www         (web模組1)
                            ----pom.xml
                ---test-hd-admin        (web模組2)
                            ----pom.xml     

建立一個父maven工程

  •   新建一個maven專案,選擇儲存位置,並選擇建立一個簡單的maven工程

   

  •   輸入Group Id、Artifact Id、Packaging,packaging選擇pom包

  •   生成父工程,pom.xml如下

  •   刪除工程中的src 目錄

建立子模組

  •   右擊父工程名---》New---》Project,然後選擇新建一個maven module工程

  •   設定子工程名以及父工程,再設定快速建立模式

  •   得到子工程(test-hd-api,第三方介面層),設定編譯的jdk

  •   同理設定,子模組:test-hd-foundation(基礎工具層)、test-hd-resource(資源層) 、test-hd-service(邏輯業務層)
  •   新建test-hd-modules (web層),選擇建立一個a simple project,輸入Group Id、Artifact Id、Packaging,packaging選擇pom包

建立web子模組

  •   web子模組在建在test-hd-modules (web層)裡面,右擊test-hd-modules 工程名---》New---》Project,然後選擇新建一個maven module工程,設定子工程名以及父工程,選擇新建web專案

 

配置個模組的依賴

  •   在parent專案pom.xml中建立依賴管理(dependencyManagement)

     

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     3     <modelVersion>4.0.0</modelVersion>
     4     <groupId>com.hd</groupId>
     5     <artifactId>test-hd-parent</artifactId>
     6     <version>0.0.1-SNAPSHOT</version>
     7     <packaging>pom</packaging>
     8     <modules>
     9         <module>test-hd-api</module>
    10         <module>test-hd-service</module>
    11         <module>test-hd-resource</module>
    12         <module>test-hd-foundation</module>
    13         <module>test-hd-modules</module>
    14     </modules>
    15 
    16 
    17     <!-- maven依賴 -->
    18     <dependencyManagement>
    19 
    20         <dependencies>
    21             <!-- hd -->
    22             <dependency>
    23                 <groupId>com.hd</groupId>
    24                 <artifactId>test-hd-api</artifactId>
    25                 <version>0.0.1-SNAPSHOT</version>
    26             </dependency>
    27 
    28             <dependency>
    29                 <groupId>com.hd</groupId>
    30                 <artifactId>test-hd-service</artifactId>
    31                 <version>0.0.1-SNAPSHOT</version>
    32             </dependency>
    33 
    34             <dependency>
    35                 <groupId>com.hd</groupId>
    36                 <artifactId>test-hd-resource</artifactId>
    37                 <version>0.0.1-SNAPSHOT</version>
    38             </dependency>
    39 
    40             <dependency>
    41                 <groupId>com.hd</groupId>
    42                 <artifactId>test-hd-foundation</artifactId>
    43                 <version>0.0.1-SNAPSHOT</version>
    44             </dependency>
    45 
    46             <!-- Servlet -->
    47             <dependency>
    48                 <groupId>javax.servlet</groupId>
    49                 <artifactId>javax.servlet-api</artifactId>
    50                 <version>3.0.1</version>
    51                 <scope>provided</scope>
    52             </dependency>
    53             <dependency>
    54                 <groupId>javax.servlet.jsp</groupId>
    55                 <artifactId>jsp-api</artifactId>
    56                 <version>2.2</version>
    57                 <scope>provided</scope>
    58             </dependency>
    59 
    60             <!-- jstl -->
    61             <dependency>
    62                 <groupId>javax.servlet</groupId>
    63                 <artifactId>jstl</artifactId>
    64                 <version>1.2</version>
    65             </dependency>
    66 
    67             <dependency>
    68                 <groupId>taglibs</groupId>
    69                 <artifactId>standard</artifactId>
    70                 <version>1.1.2</version>
    71             </dependency>
    72 
    73             <dependency>
    74                 <groupId>junit</groupId>
    75                 <artifactId>junit</artifactId>
    76                 <version>3.8.1</version>
    77                 <scope>test</scope>
    78             </dependency>
    79 
    80         </dependencies>
    81     </dependencyManagement>
    82 
    83 </project>

     

     

  •     test-hd-foundation中的依賴

     

     1 <?xml version="1.0"?>
     2 <project
     3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
     4     xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     5     <modelVersion>4.0.0</modelVersion>
     6     <parent>
     7         <groupId>com.hd</groupId>
     8         <artifactId>test-hd-parent</artifactId>
     9         <version>0.0.1-SNAPSHOT</version>
    10     </parent>
    11     <artifactId>test-hd-foundation</artifactId>
    12 
    13     <dependencies>
    14 
    15         <!-- servlet -->
    16         <dependency>
    17             <groupId>javax.servlet</groupId>
    18             <artifactId>jstl</artifactId>
    19         </dependency>
    20 
    21         <dependency>
    22             <groupId>taglibs</groupId>
    23             <artifactId>standard</artifactId>
    24         </dependency>
    25 
    26         <dependency>
    27             <groupId>junit</groupId>
    28             <artifactId>junit</artifactId>
    29         </dependency>
    30     </dependencies>
    31 
    32     <build>
    33         <plugins>
    34             <!-- define the project compile level -->
    35             <plugin>
    36                 <groupId>org.apache.maven.plugins</groupId>
    37                 <artifactId>maven-compiler-plugin</artifactId>
    38                 <version>2.3.2</version>
    39                 <configuration>
    40                     <source>1.7</source>
    41                     <target>1.7</target>
    42                 </configuration>
    43             </plugin>
    44         </plugins>
    45     </build>
    46 </project>

     

    以下幾個同上

  •     test-hd-api中的依賴關係
  •     test-hd-resource中的依賴關係
  •     test-hd-service中的依賴關係
  •  test-hd-module中的依賴關係
  •     test-hd-www中的依賴關係

     

  •     最後使用maven-update整個工程,右擊父工程名--》Maven--》Update Project

打包和釋出

  •   打包,右擊父工程名 test-hd-parent---->Run As--->Maven Install 

 

  •   打包web子工程,右擊工程名test-hd-www--->Run As ---> Maven Build...---> Goals: clean package--->Run

   

      

 

  •   右擊工程名test-hd-www,進行重新整理,找到war包,放到tomcat的webapps中,啟動tomcat,即可訪問工程http://localhost:8080/test-hd-www

    

             

  •   可以去tomcat下面webapps》test-hd-www》WEB-INF》lib中,看到引用的jar包