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开发笔记 系列博客中进行更加详细深入的分析和研究。如果大家有任何疑问或建议,欢迎留言或评论,希望我们在相互讨论、学习中一起进步。