1. 程式人生 > >Maven專案中POM檔案的詳解

Maven專案中POM檔案的詳解

pom標頭檔案的解釋

<?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>com.juvenxu.mvnbook.account</groupId>
  <artifactId>account-email</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>account-email</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
  • 程式碼的第一行是XML頭,指明瞭xml文件的版本和編碼方式。

  • project是所有pom.xml的根元素

  • modelVersion:指明瞭當前POM模型的版本,對於Maven2及Maven3來說,它只能是4.0.0

  • groupId:定義當前Maven專案隸屬的實際專案,定義專案屬於那個組,通常與域名反向一一對應

  • artifactId:該元素定義實際專案中的一個maven模組,當前專案在組中的唯一一個Id

  • version:該元素定義Maven專案當前所處的版本

  • packaging:該元素定義Maven專案的打包方式

  • name:該元素聲明瞭一個對於使用者更為友好的專案名稱。

  • scope:該元素指定依賴的範圍,預設是compile,表示該依賴對主程式碼和測試程式碼都有效。

  • maven預設的中央倉庫地址:http://repo1.maven.org/maven2/ ,可以點選直接訪問。

  • 常見的還有 (http://download.java.net/maven/2/)

  • JBoss Maven庫(http://repository.jboss.com/maven2/)

配置POM使用遠端倉庫

<project>
    ...
    <repositories>
        <repository>
            <id>jboss</id>
            <name>JBoss Repository</name>
            <url>http://repository.jboss.com/maven2</url>
            <release>   
                <enabled>true</enabled>
            </relsease>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <layout>default</layout>
        </repository>
    </repositories>
    ...
</project>
  • repository:宣告一個或多個遠端倉庫
  • 任何一個倉庫的id是唯一的,maven自帶的中央倉庫的id是central
  • url指向了倉庫的地址,該地址基於http協議
  • release:用來控制釋出版構建的下載,snapshots:用來控制快照版構建的下載
  • layout的值是default,表示倉庫佈局為maven2或maven3的預設佈局,而不是maven1的佈局
  • updatePolicy用來檢查倉庫配置更新的頻率;checksumPolicy用來配置maven檢查檢驗和檔案的策略
  • 遠端倉庫:https://mvnrepository.com/

遠端倉庫的認證

  • 在setting.xml中配置倉庫認證資訊
<settings>
    <servers>
        <server>
            <id>my-proj</id>
            <username>repo-user</username>
            <password>repo-pwd</password>
        </server>
    </servers>
</settings>

生命週期

maven的宣告週期包括:專案的清理,初始化,編譯,測試,打包,整合測試,驗證,部署,和站點生成。

  • clean生命週期,清理專案
  • default生命週期,構建專案
  • site生命週期,建立專案站點

外掛

  • Maven的具體任務是又外掛完成的,外掛是以獨立的構建形式存在的
  • 每個外掛有很多功能,每個功能就是一個外掛目標
  • 詳細的外掛列表地址:http://maven.apache.org/plugins/index.html
    • 格式為: (外掛字首:外掛目標)
  • 自定義繫結外掛:
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1.1</version>
            <!-- 外掛的執行配置 -->
            <executions>
                <id>attach-sources</id>
                <phase>verify</phase>
                <goals>
                    <goal>jar-no-fork</goal>
                </goals>
            <executions>
        </plugin>
    </plugins>
</build>
  • 在build下的plugins中宣告外掛的使用
  • executions下的executoin元素用來配置執行一些任務
  • phase配置生命週期
  • goals指定要執行的外掛目標

依賴範圍

  • 依賴範圍就是控制依賴與三種classPath的關係
    • compile:編譯範圍依賴,該依賴為預設的依賴
    • test:測試依賴範圍
    • provided:已提供依賴範圍,對於編譯和測試有效
    • runtime:執行時依賴範圍,對於測試和執行有效
    • system:系統依賴範圍,對於編譯和測試有效

構建

  • Maven的三大特性:屬性,Profile和資源過濾

屬性

  • Maven屬性預設只有在POM中才會解析

內建屬性:

  • 兩個常用的屬性: b a s e d i r {basedir}表示專案根目錄, {version}表示專案版本

POM屬性:

  • 使用者可以使用該屬性引用POM檔案中對應元素的值
  • 常用的pom屬性的值:
    • ${project.artifactId}:專案的artifactId
    • ${project.groupId}:專案的groupId
    • ${project.build.finalName}:專案打包輸出檔案的名稱
    • ${project.build.directory}:專案構建輸出目錄,預設為target

自定義屬性:

  • 使用者可以在pom檔案的元素下自定義maven屬性

setting屬性:

  • 使用者可以使用setting.開頭的屬性應用setting.xml檔案中xml元素的值

Java系統屬性:

  • 所有的java系統屬性都可以使用Maven屬性引用

環境屬性:

  • 所有的環境變數都可以用env.開頭的Maven屬性引用

資源過濾

  • Maven屬性只有在POM檔案中才會被解析,要讓Maven解析資源目錄中的Maven屬性,即開啟資源過濾
  • Maven預設的主資源目錄(src/main/resources)和測試資源目錄(src/test/resources)的定義在超級POM中
  • 一般資原始檔與web資原始檔處理不同。前者通過maven-resources-plugin處理,後者通過maven-war-plugin處理。
  • 配置主資源目錄
<resources>
    <resource>
        <dircetory>${project.basedir}/src/main/resources</directory>
        <filtering>true</filtering>   <!--開啟資源過濾-->
    <resource>
<resources>
  • 配置測試資源目錄
<testResources>
    <testResource>
        <dircetory>${project.basedir}/src/test/resources</directory>
        <filtering>true</filtering>
    <testResource>
<testResources>
  • 配置多個資源目錄
<resources>
    <resource>
        <dircetory> src/main/resources</directory>
        <filtering>true</filtering>
    <resource>
     <resource>
        <dircetory> src/main/sql</directory>
        <filtering>false</filtering>
    <resource>
<resources>   

Maven Profile

  • 啟用profile的方式
  1. 命令列啟用:$ mvn clean install - P dev-x,dev-y 啟用dev-x和dev-y兩個profile
  2. settings檔案顯式啟用:
<settings>
    <activeProfiles>
        <!--表示dev-x檔案一直處於啟用狀態-->
        <activeProfile>dev-x</activeProfile>
    </activeProfiles>
</settings>
  1. 系統屬性啟用
  2. 作業系統環境啟用
  3. 檔案存在與否啟用
  4. 預設啟用:使用者在定義profile的時候指定其預設啟用,如果有任何一個profile通過其他任意一種方式激活了,所有的預設啟用方式均會失效。
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault></activeByDefault>
            </activation>
        </profile>
    </profiles>
  • profile的種類:
    • pom.xml:pom.xml中宣告的profile只對當前專案有效。
    • 使用者settings.xml:使用者目錄下.m2/settings.xml中的profile對本機上該使用者所有的Maven專案有效
    • 全域性settings.xml:安裝目錄下.conf/settings.xml中的profile對本機上該使用者所有的Maven專案有效