一、POM简介
pom作为项目对象模型,通过使用pom.xml来实现管理maven项目,主要描述了项目的如下部分:配置文件、开发者需要遵循的规则、缺陷管理系统、组织和licenses、项目的url、项目的依赖性和其它所有的项目相关因素。
二、POM的语法规则
一份比较全的pom.xml文件可以参考如下,通过它我们来对pom.xml中的语法规则进行说明。
<project>
<modelVersion>4.0.0</modelVersion> <!--指定了当前pom版本-->
<!--maven2.0必须是这样写,现在是maven2唯一支持的版本-->
<!-- 基础设置 -->
<groupId>...</groupId> <!--整个系统的名称,-一般用反写的公司网址+项目名,比如com.moxie.hi->
<artifactId>...</artifactId> <!--子模块名称,项目名+模块名-->
<version>0.0.1-SNAPSHOT</version> <!--第一个数0表示大版本号;第二个数0表示分支版本号;第三个数1表示小版本号;SNAPSHOT 表示快照,另外还有alpha 内部测试、beta 公测、release 稳定、GA 正式发布-->
<packaging>...</packaging> <!--打包类型,可取的值有war zip pom-->
<name>...</name> <!--项目描述名-->
<url>...</url> <!--项目地址-->
<description>...</description> <!--项目描述-->
<dependencies>...</dependencies> <!--依赖列表-->
<parent>...</parent>
<dependencyManagement>...</dependencyManagement> <!--依赖的管理-->
<modules>...</modules> <!--聚合多个模块进行编译-->
<properties>...</properties>
<!--构建设置 -->
<build>...</build>
<reporting>...</reporting>
<!-- 更多项目信息 -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- 环境设置-->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
上面关于pom.xml的描述不一定详尽,下面做出部分补充。
2.1 依赖冲突的排查与解决
依赖冲突可以见此例,在项目中有两个依赖项:A和B,但是A和B同时依赖了C,依赖的C不是同一个版本。
依赖冲突的排查,可以通过添加检查插件来发现,参考如下:
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</plugin>
</plugins>
</reporting>
运行命令:mvn project-info-reports:dependencies 可以查看依赖报告。
去除冲突依赖项,可以考虑使用< exclusion>…< /exclusion>,比如我们需要在某个dependency中去除某个依赖项:
<!-- Struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts.version}</version>
<exclusions>
<exclusion> <!--去除依赖项-->
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</exclusion>
</exclusions>
</dependency>
2.2 POM中的继承
maven提供继承关系,子pom可以继承父pom的配置信息,因此可以在父pom中声明一些可供子pom继承的配置,实现“一次声明,多次使用”。在子pom中关于继承的写法可以参考如下:
<modelVersion>4.0.0</modelVersion>
<parent> <!--表示继承关系-->
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream-parent</artifactId>
<version>1.4.3</version>
</parent>
<artifactId>xstream</artifactId>
<packaging>jar</packaging>
<name>XStream Core</name>
上述继承关系表示父pom是com.thoughtworks.xstream的xstream-parent的1.4.3版本。
2.3 POM中的聚合
在pom中可以通过一个大的项目来整合各个小的模块,这种整合关系可称为POM的聚合
<modules>
<module>my-app</module>
</modules>
2.4 Maven属性
在pom.xml文件中可以通过< properties>元素自定义一个或多个Maven属性,然后再POM的其它地方使用${属性名}的方式引用该属性,这种做法的最大意义在于消除重复和统一管理。Maven总共有6类属性,内置属性、POM属性、自定义属性、Settings属性、Java系统属性和环境变量属性。
1.内置属性
常用的内置属性有两个,一个是${basedir}表示项目根目录,即包含pom.xml文件的目录;一个是 ${version}表示项目版本。
2.POM属性
用户可以使用该类属性引用POM文件中对应元素的值。如 ${project.artifactId}就对应了< project>< artifactId>元素的值,常用的POM属性包括:
$ { project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/
$ {project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/
$ {project.build.directory} : 项目构建输出目录,默认为target/
$ {project.outputDirectory} : 项目主代码编译输出目录,默认为target/classes/
$ {project.testOutputDirectory}:项目测试主代码输出目录,默认为target/testclasses/
$ {project.groupId}:项目的groupId
$ {project.artifactId}:项目的artifactId
$ {project.version}:项目的version,与${version} 等价
$ {project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}- $ {project.version}
3.自定义属性
自定义属性在此略,可以自行百度查阅。
4.Settings属性
与POM属性同理,用户可以使用settings。开头的属性引用settings.xml文件中的元素的值。
5.Java系统属性
所有Java系统属性都可以用maven属性引用,如 ${user.home}指向了用户目录。
6.环境变量属性
所有环境变量属性都可以使用env.开头的Maven属性引用,
2.5 POM 构建配置
构建中的插件管理
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<tomcat-url>http://localhost:8080/manager/html</tomcat-url>
<server>tomcat_localtest</server>
</configuration>
</plugin>
</plugins>
</pluginManagement>
指定构建时需要的资源
<resources>
<resource>
<targetPath>WEB-INF/resource</targetPath>
<!-- 不对文件中的表达式进行处理 -->
<filtering>false</filtering>
<directory>${basedir}/src/test/resources</directory>
<includes>
<include>include.xml</include>
</includes>
<excludes>
<exclude>exclude.xml</exclude>
</excludes>
</resource>
</resources>
参考
1.maven pom聚合与继承
2.Maven pom.xml中的元素modules、parent、properties以及import
3.Maven中POM.XML详解
4.Maven常用命令和 pom.xml解析
5.SpringCloud注解和配置以及pom依赖说明