POM的全称是“ProjectObjectModel(项目对象模型)”。
<projectxmlns="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.0http://maven.apache.org/maven-v4_0_0.xsd">
<!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。-->
<modelVersion>4.0.0</modelVersion>
<!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。坐标包括groupID,artifactID和version。-->
<parent>
<!--被继承的父项目的构件标识符-->
<artifactId/>
<!--被继承的父项目的全球唯一标识符-->
<groupId/>
<!--被继承的父项目的版本-->
<version/>
<!--父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。-->
<relativePath/>
</parent>
<!- groupId在一个组织或项目中通常是特有的。例如:(大概、也许)Maven所有artifacts的groupId都使用org.apache.maven。groupId并不一定必须使用点符号,例如,JUnit项目。注意使用点符号的groupId不必与项目的包结构相同,但它是一个很好的做法。 -->
<groupId>org.codehaus.mojo</groupId>
<!--artifactId一般是该项目的名字。它和groupID一起标识一个唯一的项目。换句话说,你不能有两个不同的项目拥有同样的artifactID和groupID;在某个特定的groupID下,artifactID也必须是唯一的。-->
<artifactId>my-project</artifactId>
<!--这是命名的最后一段。groupId:artifactId表示单个项目,但它们无法描绘具体的版本。如:我想要junit:junit项目今天第四版。version定义当前项目的版本,如:1.0(-SNAPSHOT),SNAPSHOT表示快照,说明该项目还处于开发阶段,是不稳定版本;建议version格式为:主版本.次版本.增量版本-限定版本号-->
<version>1.0-SNAPSHOT</version>
<!--项目产生的构件类型,例如jar、war、ear、pom等等。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型。默认值jar。-->
<packaging>jar</packaging>
<!-- ps:
groupId:artifactId:version:packaging在YouTube某些教学视频也称为UUID。
产物是如何储存在仓库中的?存放到私服库时点符号将会被解析成目录分隔符,SNAPSHOT版本在私服库中会被解析成8位日期.时分秒毫秒-序号。序号代表第几次部署。
上面的坐标将会被解析成:org/codehaus/mojo/my-project/1.0-SNAPSHOT/my-project-8位日期.时分秒毫秒-序号.jar
特例:如果你编译源代码将产物存放到本地仓库,将保持不变。
-->
<!--该元素描述了项目相关的所有依赖。这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。-->
<dependencies>
<dependency>
<!--依赖的groupID-->
<groupId>org.apache.maven</groupId>
<!--依赖的artifactID-->
<artifactId>maven-artifact</artifactId>
<!--依赖的版本号。可以配置成确定的版本号,也可以配置成版本号的范围。
(, )不包含 [, ]包含 例如:[3.8,4.0) 表示3.8 - 4.0的版本,但是不包含4.0
-->
<version>3.8.1</version>
<!--依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应,尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为true,就可以在plugin里定义新的类型。所以前面的类型的例子不完整。-->
<type>jar</type>
<!--依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成JAR,一个使用Java1.4编译器,另一个使用Java6编译器,你就可以使用分类器来生成两个单独的JAR构件。-->
<classifier></classifier>
<!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。
-compile:compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范
围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。
-provided:provided依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译时 (不是运行时)可用。它不具有传递性的,也不会被打包。
-runtime:runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你
可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实
现。
-test: test范围依赖 在一般的 编译和运行时都不需要,它们只有在测试编译和测试运
行阶段可用。
-system:system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中
JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库
的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如
果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素。注
意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用
依赖)。-->
<scope>test</scope>
<!--仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。-->
<systemPath></systemPath>
<!--默认为false,即子项目默认都继承,为true,则子项目必需显示的引入。例如:假设项目A在编译时需要项目B的代码,但运行时并不需要项目B,而且我们可能并不需要所有项目都依赖项目B。-->
<optional>true</optional>
<!--当计算传递依赖时,从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。也可以使用通配符*排除所有依赖。此元素主要用于解决版本冲突问题.-->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。-->
<optional>true</optional>
</dependency>
</dependencies>
<!--继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述groupID和artifactID信息),如果groupID和artifactID以外的一些信息没有描述,则通过groupID和artifactID匹配到这里的依赖,并使用这里的依赖信息。-->
<dependencyManagement>
<!--参见dependencies元素-->
<dependencies>
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
<!--模块(有时称作子项目)被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径-->
<modules/>
<!-- Ps:继承和模块的区别:继承父不知子,但子知父。模块父知子,但子不知父。所以在具体的项目中一般都是继承和模块融合使用。 -->
<!--键值对,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里profiles→properties元素的说明)。格式是<name>value</name>。-->
<properties>
<dept>No</dept>
</properties>
<!--构建项目需要的信息-->
<build>
<!-- 预定义执行的目标或者阶段,必须和命令行的参数相同。如:jar:jar或者clean install等等。例如:defaultGoal配置clean install ,在命令行输入mvn时会自动拼接成mvn clean install。偷懒的福音啊。-->
<defaultGoal>install</defaultGoal>
<!-- 编译输出目录,默认值${basedir}/target(不建议修改) -->
<directory>${basedir}/target</directory>
<!-- 构建产物的名称,没有文件扩展名。默认值${artifactId}-${version}。 -->
<finalName>${artifactId}-${version}</finalName>
<!-- 单独过滤某个文件,更多内容请访问如何过滤资源文件 -->
<filters>
<filter>src/main/filters/filter.properties</filter>
</filters>
<!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。-->
<resources>
<!--这个元素描述了项目相关的资源路径-->
<resource>
<!-- 指定build后的resource存放的文件夹。该路径默认是basedir。通常被打包在JAR中的resources的目标路径为META-INF -->
<targetPath></targetPath>
<!--是否使用参数值代替参数名。如:aa=name 将my ${aa}显示为my name。true代表替换,false代表不替换。参数值取自properties元素、文件里配置的属性或者命令行的-D选项。有@aa @和${aa}俩种写法。更多内容请查看在线帮助-->
<filtering>false</filtering>
<!--描述存放资源的目录,该路径相对POM路径。默认值${basedir}/src/main/resources -->
<directory>${basedir}/src/main/resources </directory>
<!--用于指定要包括的文件。可以使用通配符*。例如**/*.xml。 -->
<includes>
<include>configuration.xml</include>
</includes>
<!--用于指定不需要包括的文件。可以使用通配符*。例如**/*.xml。如果和includes的配置冲突,excludes的优先级更高。 -->
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
</resources>
<!--该testResources元素块包含testResource元素。它们的定义是类似的resource 元素,仅在测试阶段使用。和resource元素唯一一点不同是testResource的默认值是${project.basedir}/src/test/resources。测试资源是不会部署。-->
<testResources>
<testResource>
<targetPath/>
<filtering/>
<directory/>
<includes/>
<excludes/>
</testResource>
</testResources>
<plugins>
<!--plugin元素包含描述插件所需要的信息。-->
<plugin>
<!--插件在仓库里的groupID-->
<groupId>org.apache.maven.plugins</groupId>
<!--插件在仓库里的artifactID-->
<artifactId>maven-jar-plugin</artifactId>
<!--被使用的插件的版本(或版本范围)-->
<version>2.0</version>
<!--是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。-->
<extensions>false</extensions>
<!-- true 或 false ,这个插件的配置是否,可以继承。默认true。 -->
<inherited>true</inherited>
<!-- 请查阅https://maven.apache.org/pom.html#Plugins或者查阅中文版http://blog.csdn.net/tomato__/article/details/13625497 -->
<configuration>
<classifier>test</classifier>
</configuration>
<!-- 请参考dependencies元素 -->
<dependencies>
<dependency>
<groupId/>
<artifactId/>
<version/>
<type/>
<classifier/>
<scope/>
<systemPath/>
<exclusions>
<exclusion>
<artifactId/>
<groupId/>
</exclusion>
</exclusions>
<optional/>
</dependency>
</dependencies>
<!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。-->
<executions>
<!--execution元素包含了插件执行需要的信息-->
<execution>
<!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标-->
<id>echodir</id>
<!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段-->
<phase>verify</phase>
<!--配置的执行目标-->
<goals>
<goal>run</goal>
</goals>
<!--配置是否被传播到子POM-->
<inherited>false</inherited>
<!-- 请查阅https://maven.apache.org/pom.html#Plugins -->
<configuration>
<tasks>
<echo>Build Dir: ${project.build.directory}</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<!--子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置-->
<pluginManagement>
<plugins>
.................
</plugins>
</pluginManagement>
<!--该元素设置了项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。-->
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<!--该元素设置了项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。-->
<scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
<!--该元素设置了项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。-->
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
<!--被编译过的应用程序class文件存放的目录。-->
<outputDirectory>${basedir}/target/classes</outputDirectory>
<!--被编译过的测试class文件存放的目录。-->
<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
<!--使用来自该项目的一系列构建扩展-->
<extensions>
<!--描述使用到的构建扩展。-->
<extension>
<!--构建扩展的groupId-->
<groupId/>
<!--构建扩展的artifactId-->
<artifactId/>
<!--构建扩展的版本-->
<version/>
</extension>
</extensions>
</build>
<!--该元素描述使用报表插件产生报表的规范。当用户执行“mvn site”,这些报表就会运行。在页面导航栏能看到所有报表的链接。-->
<reporting>
<!--所有产生的报表存放到哪里。默认值是${basedir}/target/site
。-->
<outputDirectory>${basedir}/target/site</outputDirectory>
<!--如果为true,则网站不包括默认的报表。这包括“项目信息”菜单中的报表。默认false-->
<excludeDefaults>false</excludeDefaults>
<!--使用的报表插件和他们的配置。-->
<plugins>
<!--plugin元素包含描述报表插件需要的信息-->
<plugin>
<!--报表插件在仓库里的groupID,默认值是 : org.apache.maven.plugins 。-->
<groupId>org.apache.maven.plugins</groupId>
<!--报表插件在仓库里的artifactID-->
<artifactId>maven-project-info-reports-plugin</artifactId>
<!--被使用的报表插件的版本(或版本范围)-->
<version>2.7</version>
<!--任何配置是否被传播到子项目,默认true-->
<inherited>true<inherited/>
<!--报表插件的配置-->
<configuration/>
<!--一组报表的多重规范,每个规范可能有不同的配置。一个规范(报表集)对应一个执行目标。例如,有1,2,3,4,5,6,7,8,9个报表。1,2,5构成A报表集,对应一个执行目标。2,5,8构成B报表集,对应另一个执行目标-->
<reportSets>
<!--表示报表的一个集合,以及产生该集合的配置-->
<reportSet>
<!--报表集合的唯一标识符,POM继承时用到,默认值:default -->
<id>default<id>
<!--产生报表集合时,被使用的报表的配置-->
<configuration/>
<!--配置是否被继承到子POMs-->
<inherited/>
<!--这个集合里使用到哪些报表-->
<reports/>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>