Maven pom.xml配置详解(一)

POM的全称是“ProjectObjectModel(项目对象模型)”。

pom.xml详解

声明规范

<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>

基本内容

parent

<!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。坐标包括groupID,artifactID和version。-->

<parent>

<!--被继承的父项目的构件标识符-->

<artifactId/>

<!--被继承的父项目的全球唯一标识符-->

<groupId/>

<!--被继承的父项目的版本-->

<version/>

<!--父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。-->

<relativePath/>

</parent>

groupId

<!- groupId在一个组织或项目中通常是特有的。例如:(大概、也许)Maven所有artifacts的groupId都使用org.apache.maven。groupId并不一定必须使用点符号,例如,JUnit项目。注意使用点符号的groupId不必与项目的包结构相同,但它是一个很好的做法。 -->

<groupId>org.codehaus.mojo</groupId>

artifactId

<!--artifactId一般是该项目的名字。它和groupID一起标识一个唯一的项目。换句话说,你不能有两个不同的项目拥有同样的artifactID和groupID;在某个特定的groupID下,artifactID也必须是唯一的。-->

<artifactId>my-project</artifactId>

version

<!--这是命名的最后一段。groupId:artifactId表示单个项目,但它们无法描绘具体的版本。如:我想要junit:junit项目今天第四版。version定义当前项目的版本,如:1.0(-SNAPSHOT),SNAPSHOT表示快照,说明该项目还处于开发阶段,是不稳定版本;建议version格式为:主版本.次版本.增量版本-限定版本号-->

<version>1.0-SNAPSHOT</version>

packaging

<!--项目产生的构件类型,例如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

<!--该元素描述了项目相关的所有依赖。这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。-->

<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>

 

dependencyManagement

<!--继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述groupID和artifactID信息),如果groupID和artifactID以外的一些信息没有描述,则通过groupID和artifactID匹配到这里的依赖,并使用这里的依赖信息。-->

<dependencyManagement>

<!--参见dependencies元素-->

<dependencies>

<dependency>

......

</dependency>

</dependencies>

</dependencyManagement>

modules

<!--模块(有时称作子项目)被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径-->

<modules/>

<!-- Ps:继承和模块的区别:继承父不知子,但子知父。模块父知子,但子不知父。所以在具体的项目中一般都是继承和模块融合使用。 -->

properties

<!--键值对,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里profiles→properties元素的说明)。格式是<name>value</name>。-->

<properties>

<dept>No</dept>

</properties>

 

编译设置

build

<!--构建项目需要的信息-->

<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>

reporting

<!--该元素描述使用报表插件产生报表的规范。当用户执行“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>


你可能感兴趣的:(maven,pom)