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 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開發筆記 系列部落格中進行更加詳細深入的分析和研究。如果大家有任何疑問或建議,歡迎留言或評論,希望我們在相互討論、學習中一起進步。
相關文章
- Maven的pom.xml檔案詳解MavenXML
- Maven pom.xml檔案配置詳解MavenXML
- Maven快速入門(四)Maven中的pom.xml檔案詳解MavenXML
- iOS開發筆記(四):frame與bounds的區別詳解iOS筆記
- Maven專案中POM.xml檔案內的標籤大全詳解MavenXML
- J2EE開發筆記(一)—— J2EE開發環境配置筆記開發環境
- pom.xml詳解XML
- Maven之pom.xml與setting.xml配置檔案詳解MavenXML
- MySQL提升筆記(3)日誌檔案詳解MySql筆記
- jsp應用開發詳解筆記JS筆記
- POM.xml 標籤詳解XML
- FFmpeg開發筆記(十五)詳解MediaMTX的推拉流筆記
- Maven 教程之 pom.xml 詳解MavenXML
- Maven中的pom.xml詳解MavenXML
- Jbuilder8開發J2ee學習筆記(2) (轉)UI筆記
- hibernate筆記–實體類對映檔案”*.hbm.xml”詳解筆記XML
- 四道筆試題詳解筆試
- JSP自定義標籤開發+TLD檔案元素詳解JS
- Android學習筆記之AndroidManifest.xml檔案解析(詳解)Android筆記XML
- Qt開發技術:Q3D圖表開發筆記(四):Q3DSurface三維曲面圖顏色樣式詳解、Demo以及程式碼詳解QT3D筆記
- 痞子衡嵌入式:ARM Cortex-M開發檔案詳解(3)- 工程檔案(.ewp)
- Dockerfile檔案詳解Docker
- mtl檔案詳解
- cmake檔案詳解
- BMP檔案詳解
- LD檔案詳解
- easy雲盤專案開發筆記筆記
- 基於React的大檔案上傳元件的開發詳解React元件
- Linux系列開坑記(四)-檔案查詢工具Linux
- JVM學習筆記——Class類檔案解讀JVM筆記
- 低開開發筆記(四):實現編輯器內拖拽筆記
- Log4j 2.0在開發中的高階使用詳解—配置簡單的檔案輸出(四)
- Python改寫maven的pom.xml檔案PythonMavenXML
- 字幕檔案srt筆記筆記
- J2EE學習筆記筆記
- Kubernetes筆記(四):詳解Namespace與資源限制ResourceQuota,LimitRange筆記namespaceMIT
- 詳解四次斷開
- 瑞吉外賣專案開發筆記筆記