J2EE開發筆記(四)—— pom.xml文件詳解

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開發筆記 系列博客中進行更加詳細深入的分析和研究。如果大家有任何疑問或建議,歡迎留言或評論,希望我們在相互討論、學習中一起進步。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,821評論 18 139
  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注釋 參考 0 前言 什么是...
    阿父閱讀 12,641評論 1 36
  • 1數量與質量 一個人非常執著于把一個想法變得非常完美的時候,往往會走入死胡同 就像我一直想寫文章,想寫自己的總結,...
    L雁小七閱讀 235評論 0 0
  • 多少人連個真心話都不敢講?連個真實感受都不能與人言,太害怕失去了,反而失去了自己,失去了自己,還有什么?建立的底座...
    縱情嬉戲天地間閱讀 225評論 0 0
  • 渣男,顧名思義,不是我們所說的壞男人,壞男人可能只是三觀不正,而渣男卻完全是人品問題。壞男人雖壞但也許不渣,但有些...
    Lady_Jeline閱讀 4,625評論 0 9