【轉】maven詳解二

1. Maven多模塊項目
以模塊的形式來組織項目,可使得項目的組織結構更加清晰更易維護,每一個模塊均可以進行高內聚和獨立部署。模塊之間的依賴關係能夠自由進行組合,以提升軟件組件的重用,同時各模塊之間可以實現鬆耦合。
水平項目佈局
水平項目佈局(Flat Project Layout)指的是父模塊項目與子模塊項目處於同一級目錄下。
maven-multiple-modules-project  // 項目根目錄
  |
  |— parent-module                  // 父模塊項目
  |      |— pom.xml (pom)
  |
  |— child1-module                  // 子模塊項目
  |      |— src
  |      |— pom.xml (jar)
  |
  |— child2-module                  // 子模塊項目
  |      |— src
  |      |— pom.xml (jar)
  |
  |— child3-module                  // 子模塊項目
  |      |— src
  |      |— pom.xml (war)
  |
分層項目佈局
分層項目佈局(Hierachical Project Layout)指的是父模塊項目做爲父目錄,該目錄下包含了全部的子模塊項目。
maven-multiple-modules-project  // 父模塊項目
  |
  |— pom.xml (pom)
  |
  |— child1-module                  // 子模塊項目
  |      |— src
  |      |— pom.xml (jar)
  |
  |— child2-module                  // 子模塊項目
  |      |— src
  |      |— pom.xml (jar)
  |
  |— child3-module                  // 子模塊項目
  |      |— src
  |      |— pom.xml (war)
  |
項目佈局的差別
水平和分層結構佈局的最主要差別在於父模塊pom.xml文件是否與子模塊處於同一級目錄中。
分層項目佈局父模塊pom.xml文件與子模塊處在同一級目錄中,而水平項目佈局的方式是處在不一樣級目錄。
在多模塊項目結構中,當父模塊pom.xml文件與子模塊處在同一級目錄時,它可以給咱們帶來許多方便之處。
如在父模塊POM文件中聲明子模塊時,分層項目佈局的聲明方式爲:
<modules>
    <module>child1-module</module>
    <module>child2-module</module>
    <module>child3-module</module>
</modules

而水平項目佈局的聲明方式(因其父模塊POM文件與子模塊處在不一樣級的目錄中):html

<modules>
    <module>../child1-module</module>
    <module>../child2-module</module>
    <module>../child3-module</module>
</modules>

顯然第一種方式要比第二種方式更加簡潔。總的來講,推薦使用分層項目佈局的方式來組織項目的結構。mysql

建立分層結構佈局的項目
maven-multiple-modules-project  // 父模塊項目
  |
  |— pom.xml (pom)
  |
  |— user-facade                    // 子模塊項目
  |      |— src
  |      |— pom.xml (jar)
  |
  |— user-service                   // 子模塊項目
  |      |— src
  |      |— pom.xml (jar)
  |
  |— blog-web                       // 子模塊項目
  |      |— src
  |      |— pom.xml (war)
  |
建立父模塊項目maven-multiple-modules-sample:
mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=maven-multiple-modules-sample -Dversion=0.0.1-SNAPSHOT

進入父模塊目錄:react

cd maven-multiple-modules-sample

刪除父模塊的src目錄(父模塊是一個沒有源代碼的項目,所以不須要src目錄):web

rd /s/q src

父模塊項目的打包類型必須爲pom,修改pom.xml的打包類型以下:sql

<packaging>pom</packaging>

建立子模塊項目user-facade:數據庫

mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=user-facade -Dversion=0.0.1-SNAPSHOT

子模塊pom.xml文件中會自動生成其父模塊信息:apache

<parent>
    <groupId>org.fanlychie</groupId>
    <artifactId>maven-multiple-modules-sample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

建立子模塊項目user-serviceapp

mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=user-service -Dversion=0.0.1-SNAPSHOT

建立子模塊項目blog-web:eclipse

mvn archetype:generate -DgroupId=org.fanlychie -DartifactId=blog-web -Dversion=0.0.1-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp

在父模塊POM文件中使用<modules>聲明其子模塊:webapp

<!-- modules:
     聲明子模塊。模塊間的前後順序是沒有要求的,maven不須要開發者考慮模塊間的依賴關係,
     maven在構建項目時,它會對模塊自動進行拓撲排序並確保在依賴模塊以前構建依賴的模塊項目。
     module:
     它的值一般是子模塊項目相對於父模塊POM文件的相對路徑的名稱。
-->
<modules>
    <module>user-facade</module>
    <module>user-service</module>
    <module>blog-web</module>
</modules>

將項目導入IntelliJ IDEA(主流的JAVA IDE開發工具)。菜單:File --> Open...選擇父模塊項目:

項目導入到IntelliJ IDEA後,IntelliJ IDEA可以識別並自動將各個模塊轉換成maven項目。如圖示:
在命令行中執行打包項目的命令,如在cmd中到父模塊根目錄下執行:
$ mvn clean -Dmaven.test.skip package
能夠看到,maven在構建多模塊項目時,它會根據模塊之間的依賴關係,整理出一個新的構建順序,而後再按這個順序來構建各個模塊。構建完成以後,會在各個子模塊項目的target目錄下生成輸出相對應的jar或war軟件包。
在IntelliJ IDEA中運行web項目:
建立水平結構佈局的項目
maven-multiple-modules-sample   // 項目根目錄
  |
  |— parent-module                  // 父模塊項目
  |      |— pom.xml (pom)
  |
  |— user-facade                    // 子模塊項目, 用戶接口層
  |      |— src
  |      |— pom.xml (jar)
  |
  |— user-service                   // 子模塊項目, 用戶業務層
  |      |— src
  |      |— pom.xml (jar)
  |
  |— blog-web                       // 子模塊項目, 訪問控制層
  |      |— src
  |      |— pom.xml (war)
  |
按分層結構佈局方式建立多模塊項目,而後在項目根目錄maven-multiple-modules-sample下建立父模塊目錄parent-module,並將maven-multiple-modules-sample/pom.xml文件移動到parent-module文件中。修改parent-module/pom.xml(<artifactId>、<name>、<modules>)配置以下:
<?xml version="1.0" encoding="UTF-8"?>
<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>org.fanlychie</groupId>
    <artifactId>parent-module</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>parent-module</name>
    <url>http://maven.apache.org</url>
    <!-- 子模塊的相對路徑(相對父模塊pom.xml的路徑) -->
    <modules>
        <module>../user-facade</module>
        <module>../user-service</module>
        <module>../blog-web</module>
    </modules>
</project>

子模塊項目pom.xml配置文件中繼承父模塊部分的配置修改成:

<parent>
    <groupId>org.fanlychie</groupId>
    <artifactId>parent-module</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- 用於指定父模塊POM的相對路徑。它的默認值是"../" -->
    <relativePath>../parent-module</relativePath>
</parent>

子模塊POM繼承父模塊POM,在子模塊POM配置中<relativePath>用於指定其父模塊的POM文件的相對路徑。若是<relativePath>配置的值是一個目錄,則默認尋找該目錄下的/pom.xml文件。即等效於:

<parent>
    <groupId>org.fanlychie</groupId>
    <artifactId>parent-module</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- 用於指定父模塊POM的相對路徑。它的默認值是"../" -->
    <relativePath>../parent-module/pom.xml</relativePath>
</parent>

將項目導入IntelliJ IDEA。菜單:File --> Open...選擇項目的根目錄:

導入後是一個普通文件目錄,IntelliJ IDEA不可以識別出是maven項目,如圖示:
接下來須要將項目轉換爲maven項目,菜單:File --> New --> Module from Existing Sources...
仍然選到項目的根目錄:
選擇maven,點擊下一步:
勾選複選框Search for projects recursively遞歸搜索項目:
選擇maven構建環境:
直接下一步:
選擇編譯使用的JDK版本,點擊完成按鈕:
若是項目還報找不到JDK的問題,按快捷鍵Ctrl+Alt+Shift+S從新選擇JDK:
子模塊可繼承的POM元素
父模塊項目POM配置文件中的大部分元素信息可以被子模塊所繼承,這些元素有:
元素
描述
groupId
項目組ID
version
項目版本號
description
項目描述信息
url
項目的地址
inceptionYear
項目成立年份
organization
項目的組織信息
licenses
項目許可證
developers
項目開發者信息
contributors
項目貢獻者信息
mailingLists
項目的郵件列表
scm
項目源代碼管理系統信息
issueManagement
項目缺陷跟蹤管理系統信息
properties
項目自定義的屬性
dependencyManagement
項目的依賴管理配置
dependencies
項目的依賴配置
repositories
項目的倉庫配置
pluginRepositories
項目的插件倉庫配置
build
項目的構建配置
profiles
項目的環境配置

2. Maven多模塊項目版本管理
若是一個項目要迭代一個新的版本,特別是對於一些子模塊數量較多的項目,那就須要手工的一個一個的去修改各個模塊POM中的版本號信息,這顯然不是一個最好的作法。 Versions Maven Plugin可用於管理控制Maven多模塊項目POM中的版本號信息。
用於設置當前項目的版本。若是當前項目是一個父模塊項目,則修改會傳播給全部的子模塊項目。
$ mvn versions:set -DnewVersion=0.0.2-SNAPSHOT
在項目pom.xml目錄下執行此命令,以更新項目POM的版本號信息。以此同時會在此目錄下生成一個pom.xml.versionsBackup文件,該文件是執行更新項目版本號信息前,對當前項目pom.xml文件的一個備份文件。
versions:revert
恢復項目pom.xml文件的上一個版本號信息。回滾的過程依賴生成的pom.xml.versionsBackup文件。若是恢復成功,插件會自動刪除pom.xml.versionsBackup文件。
versions:commit
提交項目版本號信息的修改。提交後插件會自動刪除pom.xml.versionsBackup文件。

3. Maven多環境構建配置
一個項目從開發到最後發佈上線,一般須要在多套不一樣的環境經受反覆的測試和驗證,例如開發環境、測試環境、預生產環境、生產環境等。項目部署到不一樣的環境時,項目的配置一般也是不一樣的,例如數據庫的數據源配置等。maven提供了一套profiles配置,開發者能夠在項目POM文件中預先定義好若干個不一樣環境的profile配置,項目能夠根據不一樣的構建參數來動態選擇其中的一個環境設置。這就意味着相同的一套項目代碼,能夠在構建時根據傳入的不一樣環境參數打出不一樣環境的軟件包來。這也是maven竭力保證的軟件可移植性。
多環境配置
項目pom.xml配置示例以下:
<!-- 多環境構建配置 -->
<profiles>
    <!-- 開發環境配置 -->
    <profile>
        <!-- 標識符, 能夠經過 -P[id] 來激活 --> <!-- -Pdev -->
        <id>dev</id>
        <!-- 激活條件 -->
        <activation>
            <!-- 能夠經過 -D[name]=[value] 來激活 --> <!-- -Denv=dev -->
            <property>
                <name>env</name>
                <value>dev</value>
            </property>
            <!-- 默認激活 -->
            <activeByDefault>true</activeByDefault>
        </activation>
        <!-- 自定義的屬性, 能夠經過 ${label} 來引用 --> <!-- ${jdbcUrl} -->
        <properties>
            <jdbcUrl>jdbc:mysql://localhost:3306/dev</jdbcUrl>
        </properties>
    </profile>
    <!-- 測試環境配置 -->
    <profile>
        <!-- 標識符, 能夠經過 -P[id] 來激活 --> <!-- -Ptest -->
        <id>test</id>
        <!-- 激活條件 -->
        <activation>
            <!-- 能夠經過 -D[name]=[value] 來激活 --> <!-- -Denv=dev -->
            <property>
                <name>env</name>
                <value>test</value>
            </property>
        </activation>
        <!-- 自定義的屬性, 能夠經過 ${label} 來引用 --> <!-- ${jdbcUrl} -->
        <properties>
            <jdbcUrl>jdbc:mysql://localhost:3306/test</jdbcUrl>
        </properties>
    </profile>
</profiles>

自定義屬性<properties>須要配合<resources>使用才能發揮做用:

<build>
    <!-- 類路徑資源配置, 最終輸出到軟件包中 -->
    <resources>
        <resource>
            <!-- 資源目錄路徑, 此路徑是相對當前POM文件的位置 -->
            <directory>src/main/resources</directory>
            <!-- filtering=true, 可以代入具體的值替換${label}佔位符 -->
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

項目配置文件src/main/resources/environment.properties的內容以下:

mysql.jdbc.url = ${jdbcUrl}

打包開發環境的軟件包:

$ mvn clean -Pdev package

或:

$ mvn clean -Denv=dev package

打包測試環境的軟件包:

$ mvn clean -Ptest package

或:

$ mvn clean -Denv=test package

配置的方式

maven支持的profile配置方式主要有如下幾種:
  1. 與項目相關的profile配置能夠定義在項目pom.xml文件中;
  2. 與用戶相關的profile配置能夠定義在用戶settings.xml(%USER_HOME%/.m2/settings.xml)文件中;
  3. 全局的profile配置能夠定義在全局settings.xml(%MAVEN_HOME%/.m2/settings.xml)文件中;
外部文件(用戶或全局settings.xml文件)方式配置的profile是沒法移植的。這種方式你只能經過配置<repositories>、<pluginRepositories>、<properties>三個標籤元素來影響構建的過程,但並不能改變構建最終輸出的結果。
內嵌配置(項目pom.xml文件)方式配置的profile是在項目內部定義的,所以它具備良好的可移植性。這種方式你有更多的標籤元素可選擇,而且可以改變構建最終輸出的結果。這些標籤元素有:
<profile>
    <!-- 參與構建的模塊 -->
    <modules>...</modules>
    <!-- 構件依賴聲明 -->
    <dependencies>...</dependencies>
    <!-- 構件依賴管理 -->
    <dependencyManagement>...</dependencyManagement>
    <!-- 構件發佈管理 -->
    <distributionManagement>...</distributionManagement>
    <!-- 插件倉庫 -->
    <pluginRepositories>...</pluginRepositories>
    <!-- 自定義屬性 -->
    <properties>...</properties>
    <!-- 生成站點的報告信息 -->
    <reporting>...</reporting>
    <!-- 構件倉庫 -->
    <repositories>...</repositories>
    <!-- 構建配置 -->
    <build>
        <!-- 默認的構建目標, 在命令行中若是直接執行mvn沒有帶生命週期階段, 則默認執行此處配置的階段 -->
        <defaultGoal>...</defaultGoal>
        <!-- 類路徑資源 -->
        <resources>...</resources>
        <!-- 單元測試的類路徑資源 -->
        <testResources>...</testResources>
        <!-- 打包的名稱 -->
        <finalName>...</finalName>
    </build>
</profile>

激活方式

用戶或全局settings.xml以及項目pom.xml的配置可使用<activeByDefault>來激活:
<profile>
    <id>dev</id>
    <activation>
        <!-- 默認激活 -->
        <activeByDefault>true</activeByDefault>
    </activation>
</profile>

用戶或全局settings.xml的配置還可使用<activeProfiles>來激活:

<profile>
    <id>dev</id>
</profile>
<activeProfiles>
    <!-- 根據ID標識符來激活 -->
    <activeProfile>dev</activeProfile>
</activeProfiles>

命令行可使用-P[id]或-P [id]或-P [id1,id2]來激活:

<profile>
    <id>dev</id>
</profile>
<profile>
    <id>test</id>
</profile>

$ mvn clean -Pdev package

$ mvn clean -P dev package
$ mvn clean -P dev,test package
命令行還可使用-D[name]=[value]的方式來激活:
<profile>
    <activation>
        <property>
            <name>env</name>
            <value>dev</value>
        </property>
    </activation>
</profile>

$ mvn clean -Denv=dev package

查看激活
$ mvn help:active-profiles
輸出信息示例以下:
The following profiles are active:
- jdk7-development (source: external)
- dev (source: org.fanlychie:maven-multiple-modules-sample:0.0.2-SNAPSHOT)
相關文章
相關標籤/搜索