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