J2EE開發筆記(四)—— pom.xml檔案詳解

weixin_33978044發表於2017-05-12

1. pom.xml簡介

POM是Project Object Model的縮寫,pom.xml 則是每一個Maven工程必備的檔案之一。我們這裡引用官網上對POM的簡介。

A Project Object Model or POM is the fundamental unit of work in Maven. It is an XML file that contains information about the project and configuration details used by Maven to build the project. Some of the configuration that can be specified in the POM are the project dependencies, the plugins or goals that can be executed, the build profiles, and so on. Other information such as the project version, description, developers, mailing lists and such can also be specified. POM stands for "Project Object Model". It is an XML representation of a Maven project held in a file named pom.xml . In fact, in the Maven world, a project need not contain any code at all, merely a pom.xml.

如果你想更加深入地瞭解 pom.xml 檔案的方方面面,強烈推薦你閱讀官方的參考文件: Introduction to the POMPOM Reference

2. pom.xml實戰

下面,我們以一個實際專案中的 pom.xml 檔案作為實戰案例,分析裡面所有元素和屬性的含義和用法。我們會以xml檔案註釋的形式進行分析和說明。我們本次實戰是基於一個最基本的Maven專案場景,不可能涵蓋所有的Maven配置元素,我們會在 Maven開發筆記 系列部落格中,對Maven做更加深入的學習和研究。本次實戰的 pom.xml 檔案如下:

<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">
    
    <!-- xml檔案中,定義名稱空間的格式為:xmlns:namespace-prefix="namespaceURI"
        定義預設名稱空間的格式為:xmlns="namespaceURI" -->
    <!-- pom檔案本身就是一個xml檔案,最高階別的元素就是project元素,該元素定義瞭如下屬性:
        xmlns:定義了該元素下的所有子元素的預設名稱空間為:http://maven.apache.org/POM/4.0.0
        xmlns:xsi:定義了一個namespace-prefix,其代表的名稱空間URI為:http://www.w3.org/2001/XMLSchema-instance
            定義該namespace-prefix主要是為了使用其所代表的名稱空間中的schemaLocation屬性時,比較簡潔
            其中,使用xsi作為namespace-prefix,並不是硬性規定,只是大家都這麼用,方便閱讀理解,
            當然了,如果你執意要改成別的命名,也是可以的
        xsi:schemaLocation:該屬性的使用格式為:xsi:schemaLocation="namespaceURI1 schemaURI1 namespaceURI2 schemaURI2 ..."
            其表示的意思是,使用schemaURI1所對應的schema檔案,校驗名稱空間namespaceURI1下的元素,schemaURIN以此類推 -->
    
    <!-- Maven專案基本資訊,即專案座標定義 BEGIN-->
    <!-- modelVersion 指定了當前POM模型的版本,對於Maven2 及Maven3 來說,只能是4.0.0 -->    
    <modelVersion>4.0.0</modelVersion>
    <!-- groupId 表明其所屬組織或公司,有時候會加上所屬的專案,命名規則為組織或公司域名反轉,或者再加專案名稱 -->
    <groupId>top.qiumengchen</groupId>
    <!-- artifactId 專案的模組名,有時候和專案名保持一致,有時候為"專案名-模組名" -->
    <artifactId>basement</artifactId>
    <!-- version 當前專案的版本號,SHAPSHOT意為快照,說明該專案還處於開發中 -->
    <version>0.0.1-SNAPSHOT</version>
    <!-- packaging 定義專案的打包方式,常用可選值:jar、war、pom等,預設方式為jar -->
    <packaging>war</packaging>
    <!-- name 宣告瞭一個對於使用者更加友好的專案名稱,非必須項 -->
    <name>My Basement Maven Project</name>
    <!-- Maven專案基本資訊,即專案座標定義 END-->
    
    <!-- 屬性定義 BEGIN-->
    <!-- properties 通過該元素,使用者可以自定義一個或多個Maven屬性,然後在POM的其他地方
        使用${屬性名稱}的方式引用該屬性,從而消除重複,保證檔案的一致性 -->
    <properties>
        <project.build.encoding>UTF-8</project.build.encoding>
        <springframework.version>3.2.1.RELEASE</springframework.version>
    </properties>
    <!-- 屬性定義 END-->
    
    <!-- 依賴定義 BEGIN-->
    <dependencies>
        <!-- groupId、artifactId、version 元素的含義同Maven專案基本資訊中的對應元素含義一致
            type 指依賴的型別,對應於專案座標定義的packaging,其預設值為jar
            scope 依賴的作用範圍,例如:compile、test、provided、runtime、system,預設compile
            optional 標記依賴是否可選,主要在該專案被其他專案依賴的時候起作用,取值有:true、false。預設false
            exclusions 用來排除傳遞性依賴,用於排除某些不需要或不想要的特定依賴 -->
            
        <!-- SpringFramework 相關依賴 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${springframework.version}</version>
            <scope>test</scope>
        </dependency>
        
        <!-- Apache Commons相關依賴 -->
        <!-- dbcp元件,提供資料庫連線池功能 -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <!-- fileupload元件,提供檔案上傳、下載等功能 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- lang元件,提供對Java核心類庫,特別是java.lang類庫的擴充套件,提供了很多便利的方法 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
        
        <!-- 日誌工具,log4j和commons-logging配合使用,效果最佳 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>
        <!-- 使用slf4j接管commons-logging的職責,替換系統中已經存在的日誌系統 -->
        <!-- slf4j核心jar包 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.6</version>
        </dependency>
        <!-- 接管commons-logging的職責,使用common-loggin的介面,底層還是由SLF4J來決定哪種實現機制 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.6.6</version>
            <scope>runtime</scope>
        </dependency>
        <!-- 使用SLF4J的介面,底層由log4j實現 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.6</version>
            <scope>runtime</scope>
        </dependency>
        
        <!-- JUnit 依賴 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
        
        <!-- 資料庫相關依賴 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>2.3.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.0.8</version>
            <scope>runtime</scope>
        </dependency>
                        
        <!-- fge json schema begin -->
         <dependency>  
            <groupId>com.fasterxml.jackson.core</groupId>  
            <artifactId>jackson-core</artifactId>  
            <version>2.3.0</version>    
        </dependency>  
        <dependency>  
            <groupId>com.fasterxml.jackson.core</groupId>  
            <artifactId>jackson-databind</artifactId>  
            <version>2.3.0</version>    
        </dependency>  
        <dependency>  
            <groupId>com.github.fge</groupId>  
            <artifactId>json-schema-validator</artifactId>  
            <version>2.2.6</version>    
        </dependency>  
        <!-- fge json schema end -->
        
    </dependencies>
    <!-- 依賴定義 END-->
  
    <!-- Maven打包引數 BEGIN -->
    <profiles>
        <!-- profile 可以讓我們定義一系列的配置資訊,然後指定其啟用條件。
            可以定義多個profile,然後每個profile對應不同的啟用條件和配置資訊,
            從而達到不同情況下使用不同配置資訊的效果。
            啟用條件包括但不僅限於:不同JDK,不同作業系統資訊,顯式指定啟用profile的id -->
        <profile>
            <id>development</id>
            <properties>
                <env>development</env>
            </properties>
        </profile>
        <profile>
            <id>beta</id>
            <properties>
                <env>beta</env>
            </properties>
        </profile>
        <profile>
            <id>production</id>
            <properties>
                <env>production</env>
            </properties>
        </profile>
    </profiles>
    <!-- Maven打包引數 END -->
    
    <!-- Maven編譯設定 BEGIN -->
    <build>
        <!-- finalName 指定了最終構建的檔案的名稱格式,預設繼承Maven預設父POM設定,即artifactId-version -->
        <finalName>basement</finalName>
        <!-- profile、filter、resource元素結合實現生成不同的釋出包時,對資源進行不同的替換操作
        下面這段配置以及結合profile的配置表示:
        對src/main/resources下的資源進行過濾,過濾時採用的過濾檔案為filter元素指定的檔案,
        其中${env}是由編譯時通過-P指定的profile決定的,
        過濾即指,使用filter中定義的變數的value替換src/main/resources目錄下相同key變數的value -->
        <filters>
            <filter>vars/var.${env}.properties</filter>
        </filters>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <!-- 外掛管理 -->
        <plugins>
            <!-- 配置編譯Java程式碼外掛,source指定編譯Java 1.6版本的原始檔,target指定生成與JVM 1.6相容
                的位元組碼檔案,encoding指定編譯時採用的編碼為UTF-8 -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>${project.build.encoding}</encoding>
                </configuration>
            </plugin>
            <!-- 配置處理資原始檔的方式,encoding指定處理時採用的編碼為UTF-8 -->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <encoding>${project.build.encoding}</encoding>
                </configuration>
            </plugin>
        </plugins>    
    </build>
    <!-- Maven編譯設定 END -->
</project>

3. 總結

我們本次實戰所採用的 pom.xml 檔案比較簡單,僅僅涵蓋了Maven常用的配置元素。我們會在 Maven開發筆記 系列部落格中進行更加詳細深入的分析和研究。如果大家有任何疑問或建議,歡迎留言或評論,希望我們在相互討論、學習中一起進步。

相關文章