maven项目配置文件pom.xml详解

pom为project object model的缩写,即项目对象模型,是maven管理项目包的配置文件。

一、配置文件概览

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <!--模型的版本,即pom的版本,maven2或maven3对应的是4.0.0 -->
  6. <modelVersion>4.0.0</modelVersion>
  7. <!-- 基础设置 -->
  8. <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.shixinke.order,maven会将该项目打成的jar包放本地路径:/com/shixinke/order -->
  9. <groupId>com.shixinke.order</groupId>
  10. <!-- 本项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
  11. <artifactId>shixinke-order</artifactId>
  12. <!-- 本项目当前所处版本 -->
  13. <version>1.0.0</version>
  14. <!-- 打包的机制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar -->
  15. <packaging>war</packaging>
  16. <!-- 帮助定义构件输出的一些附属构件,附属构件与主构件对应,有时候需要加上classifier才能唯一的确定该构件 不能直接定义项目的classifer,因为附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的 -->
  17. <classifier>...</classifier>
  18. <!-- 定义本项目的依赖关系 -->
  19. <dependencies>...</dependencies>
  20. <!-- 定义本pom的父级模型,可以从父级模型中继承其相关的属性 -->
  21. <parent>...</parent>
  22. <!-- 依赖管理。 dependencyManagement 中的 dependencies 元素只表明依赖项版本的优先选择,并不影响项目的依赖项;而 dependencies 元素则影响项目的依赖项。 -->
  23. <dependencyManagement>...</dependencyManagement>
  24. <!--多模块定义-->
  25. <modules>...</modules>
  26. <!-- 为pom定义一些常量,在pom中的其它地方可以直接引用 使用方式 如下 :${file.encoding} -->
  27. <properties>...</properties>
  28. <!-- 构建设置 -->
  29. <!-- 项目构建配置,包括构建目录、插件等 -->
  30. <build>...</build>
  31. <!--用于生成报表。<reporting>中也可以配置插件<plugins>,并通过一个<plugin>的<reportSet>为该插件配置参数-->
  32. <reporting>...</reporting>
  33. <!--项目的名称, Maven产生的文档用 -->
  34. <!--项目名称-->
  35. <name>...</name>
  36. <!--项目描述-->
  37. <description>...</description>
  38. <!--项目主页的URL, Maven产生的文档用 -->
  39. <url>...</url>
  40. <!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。 -->
  41. <inceptionYear>...</inceptionYear>
  42. <!--该元素描述了项目所有License列表。应该只列出该项目的license列表,不要列出依赖项目的license列表。 -->
  43. <!--如果列出多个license,用户可以选择它们中的一个而不是接受所有license。 -->
  44. <licenses>...</licenses>
  45. <!--项目开发者所属组织 -->
  46. <organization>...</organization>
  47. <!--项目开发者列表 -->
  48. <developers>...</developers>
  49. <!--项目贡献者列表 -->
  50. <contributors>...</contributors>
  51. <!-- 环境设置 -->
  52. <!--项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL -->
  53. <issueManagement>...</issueManagement>
  54. <!--项目持续集成信息 -->
  55. <ciManagement>...</ciManagement>
  56. <!--项目相关邮件列表信息 -->
  57. <mailingLists>...</mailingLists>
  58. <!--SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。 -->
  59. <scm>...</scm>
  60. <!--描述了这个项目构建环境中的前提条件。 -->
  61. <prerequisites>...</prerequisites>
  62. <!--发现依赖和扩展的远程仓库列表。 -->
  63. <repositories>...</repositories>
  64. <!--发现插件的远程仓库列表,这些插件用于构建和报表 -->
  65. <pluginRepositories>...</pluginRepositories>
  66. <!--项目分发信息,在执行mvn deploy后表示要发布的位置。 -->
  67. <!--有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 -->
  68. <distributionManagement>...</distributionManagement>
  69. <!--在列的项目构建profile,如果被激活,会修改构建处理 -->
  70. <profiles>...</profiles>
  71. </project>

二、基础设置

1、classifier

classifier元素用来帮助定义构件输出的一些附属构件。附属构件与主构件对应,比如主构件是 kimi-app-2.0.0.jar,该项目可能还会通过使用一些插件生成 如kimi-app-2.0.0-javadoc.jar (Java文档)、 kimi-app-2.0.0-sources.jar(Java源代码) 这样两个附属构件。这时候,javadoc、sources就是这两个附属构件的classifier,这样附属构件也就拥有了自己唯一的坐标。

classifier的用途在于:

  • (1). maven download javadoc / sources jar包的时候,需要借助classifier指明要下载那个附属构件
  • (2). 引入依赖的时候,有时候仅凭groupId、artifactId、version无法唯一的确定某个构件,需要借助classifier来进一步明确目标。比如JSON-lib,有时候会同一个版本会提供多个jar包,在JDK1.5环境下是一套,在JDK1.3环境下是一套:
  1. <dependency>
  2. <groupId>net.sf.json-lib</groupId>
  3. <artifactId>json-lib</artifactId>
  4. <version>2.4</version>
  5. <classifier>jdk15</classifier>
  6. </dependency>
2、dependencies
  1. <dependencies>
  2. <!-- 每个dependency都对应这一个jar包 -->
  3. <dependency>
  4. <!--一般情况下,maven是通过groupId、artifactId、version这三个元素值(俗称坐标)来检索该构件, 然后引入你的工程。如果别人想引用你现在开发的这个项目(前提是已开发完毕并发布到了远程仓库),-->
  5. <!--就需要在他的pom文件中新建一个dependency节点,将本项目的groupId、artifactId、version写入, maven就会把你上传的jar包下载到他的本地 -->
  6. <groupId>com.winner.trade</groupId>
  7. <artifactId>trade-test</artifactId>
  8. <version>1.0.0-SNAPSHOT</version>
  9. <!-- maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。 -->
  10. <!--scope包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围) -->
  11. <scope>test</scope>
  12. <!-- 设置指依赖是否可选,默认为false,即子项目默认都继承:为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似 -->
  13. <optional>false</optional>
  14. <!-- 屏蔽依赖关系。 比如项目中使用的libA依赖某个库的1.0版,libB依赖某个库的2.0版,现在想统一使用2.0版,就应该屏蔽掉对1.0版的依赖 -->
  15. <exclusions>
  16. <exclusion>
  17. <groupId>org.slf4j</groupId>
  18. <artifactId>slf4j-api</artifactId>
  19. </exclusion>
  20. </exclusions>
  21. </dependency>
  22. </dependencies>
3、parent

指定父级pom,可以继承父级的属性,主要用于多模块项目中。比如项目结构如下:

  1. project
  2. |- order
  3. |- pom.xml
  4. |- user
  5. |- pom.xml
  6. |- pom.xml

如project/pom.xml内容如下:

  1. <modelVersion>4.0.0</modelVersion>
  2. <groupId>com.project.main</groupId>
  3. <artifactId>project-module</artifactId>
  4. <version>1.0.2</version>
  5. <packaging>pom</packaging>
  6. <name>Simple-main</name>

project/order/pom.xml内容如下:

  1. <parent>
  2. <groupId>com.project.main</groupId>
  3. <artifactId>project-module</artifactId>
  4. <version>1.0.2</version>
  5. <relativePath>../pom.xml</relativePath> <!--本例中此处是可选的-->
  6. </parent>

注:order模块可以继承project主配置的属性

4、dependencyManagement
  • dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
  • dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>javax.servlet</groupId>
  5. <artifactId>servlet-api</artifactId>
  6. <version>2.5</version>
  7. </dependency>
  8. </dependencies>
  9. </dependencyManagement>
5、modules

主要用于多模块的定义:
比如,在常见的web项目中将项目分为几层,也可以使用modules来,如:

  • Dao层负责数据库交互,封装了Hibernate交互的类。
  • Service层处理业务逻辑,放一些Service接口和实现相关的Bean。
  • Web层负责与客户端交互,主要有一些Structs的Action类。
  1. <modules>
  2. <module>app-dao</module>
  3. <module>app-service</module>
  4. <module>app-web</module>
  5. </modules>

注:这里的module中的名称是各项目包的唯一名称

(1)项目配置pom.xml
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>org.myorg.myapp</groupId>
  5. <artifactId>app-project</artifactId>
  6. <packaging>pom</packaging>
  7. <version>1.0-SNAPSHOT</version>
  8. <modules>
  9. <module>app-util</module>
  10. <module>app-dao</module>
  11. <module>app-service</module>
  12. <module>app-web</module>
  13. </modules>
  14. </project>
(2)模块dao层的配置dao/pom.xml
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <parent>
  4. <artifactId>app-project</artifactId>
  5. <groupId>org.myorg.myapp</groupId>
  6. <version>1.0-SNAPSHOT</version>
  7. </parent>
  8. <modelVersion>4.0.0</modelVersion>
  9. <artifactId>app-dao</artifactId>
  10. <dependencies>
  11. <dependency>
  12. <groupId>commons-lang</groupId>
  13. <artifactId>commons-lang</artifactId>
  14. <version>2.4</version>
  15. </dependency>
  16. </dependencies>
  17. </project>

注:parent为项目配置的groupId,actifactId,version
子配置的artifactId为主配置的module对应的名称

6、properties

为pom定义一些常量,在pom中的其它地方可以直接引用,在jsp页面使用方式 如下 :${file.encoding}

  1. <properties>
  2. <file.encoding>UTF-8</file.encoding>
  3. <java.source.version>1.5</java.source.version>
  4. <java.target.version>1.5</java.target.version>
  5. </properties>

三、构建设置

1、finalName

构建生成的最终的文件名,默认为默认值是${artifactId}-${version}

  1. <finalName>myPorjectName</finalName>
2、directory

构建产生的所有文件存放的目录,默认为${basedir}/target,即项目根目录下的target

  1. <directory>${basedir}/target</directory>
3、filters

当filtering开关打开时,使用到的过滤器属性文件列表
项目配置信息中诸如${spring.version}之类的占位符会被属性文件中的实际值替换掉

  1. <filters>
  2. <filter>../filter.properties</filter>
  3. </filters>
4、resources

项目相关的所有资源路径列表,例如和项目相关的配置文件、属性文件,这些资源被包含在最终的打包文件里

  1. <resources>
  2. <resource>
  3. <!--描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。 -->
  4. <!--举个例子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven/messages。 -->
  5. <!--然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。 -->
  6. <targetPath>resources</targetPath>
  7. <!--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。 -->
  8. <filtering>true</filtering>
  9. <!--描述存放资源的目录,该路径相对POM路径 -->
  10. <directory>src/main/resources</directory>
  11. <!--包含的模式列表 -->
  12. <includes>
  13. <include>**/*.properties</include>
  14. <include>**/*.xml</include>
  15. </includes>
  16. <!--排除的模式列表 如果<include>与<exclude>划定的范围存在冲突,以<exclude>为准 -->
  17. <excludes>
  18. <exclude>jdbc.properties</exclude>
  19. </excludes>
  20. </resource>
  21. </resources>
5、plugins

使用的插件列表

  1. <plugins>
  2. <plugin>
  3. <groupId></groupId>
  4. <artifactId>maven-assembly-plugin</artifactId>
  5. <version>2.5.5</version>
  6. <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->
  7. <executions>
  8. <execution>
  9. <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->
  10. <id>assembly</id>
  11. <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->
  12. <phase>package</phase>
  13. <!--配置的执行目标 -->
  14. <goals>
  15. <goal>single</goal>
  16. </goals>
  17. <!--配置是否被传播到子POM -->
  18. <inherited>false</inherited>
  19. </execution>
  20. </executions>
  21. <!--作为DOM对象的配置,配置项因插件而异 -->
  22. <configuration>
  23. <finalName>${finalName}</finalName>
  24. <appendAssemblyId>false</appendAssemblyId>
  25. <descriptor>assembly.xml</descriptor>
  26. </configuration>
  27. <!--是否从该插件下载Maven扩展(例如打包和类型处理器), -->
  28. <!--由于性能原因,只有在真需要下载时,该元素才被设置成true。 -->
  29. <extensions>false</extensions>
  30. <!--项目引入插件所需要的额外依赖 -->
  31. <dependencies>
  32. <dependency>...</dependency>
  33. </dependencies>
  34. <!--任何配置是否被传播到子项目 -->
  35. <inherited>true</inherited>
  36. </plugin>
  37. </plugins>