一、POM含义
二、POM中的元素
(1)project下的子元素
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 -->
<version>1.0</version>
<!--打包方式,没有定义packaging时默认jar-->
<packaging>jar</packaging>
<!--项目构件的文件名与坐标是相对应的,一般规则:
artifactId-version[-classfier-].packaging
强调:packaging并非一定与构件扩展名一致,例:
<packaging>maven-plugin</packaging>的构件扩展名为jar -->
<!--项目依赖配置,可以包含一个或者多个<dependency>元素-->
<dependencies>
<!--每个依赖的具体配置-->
<dependency></dependency>
</dependencies>
</project>
(2)<dependencies>元素,依赖的配置:
<!--项目依赖配置,可以包含一个或者多个<dependency>元素-->
<dependencies>
<!--每个依赖的具体配置-->
<dependency>
<!--groupId,artifactId,version基础依赖坐标-->
<groupId> ...</groupId>
<artifactId> ...</artifactId>
<version> ...</version>
<!--依赖的类型,对应于项目坐标中的packaging,一般不需要声明,默认jar-->
<type>jar</type>
<!--依赖范围-->
<scope>test</scope>
<!--标记依赖是否可选,默认false-->
<optional>false</optional>
<!---->
<systemPath>{basedir}\src\lib\</systemPath>
<!--用于排除传递性依赖-->
<exclusions>
<!--要排除的具体依赖-->
<exclusion>
<artifactId> ...</artifactId>
<groupId> ...</groupId>
</exclusion>
.
.
</exclusions>
</dependency>
</dependencies>
scope(依赖的范围)解析:maven在编译项目主代码的时候需要使用一套classpath,编译和执行测试的时候会使用另一套classpath,实际运行maven项目的时候又会使用一套classpath,依赖范围就是用来控制依赖与这三种classpath(编译classpath,测试classpath和运行classpath)的关系,Maven有以下几种依赖范围:
① compile:编译依赖范围。如果没有指定scope默认就是此依赖范围。使用此依赖范围的maven依赖,对应编译,测试和运行三种classpath都有效。例:spring-core,在编译,测试和运行的时候都需要使用该依赖。
② test:测试依赖范围。使用此依赖范围的maven依赖,只对于测试classpath有效,在编译主代码或者运行项目时都无法使用此类依赖。例:Junit,它只在编译测试代码或者运行测试代码的时候才能使用该依赖。
③ provided:已提供依赖范围。使用此依赖范围的maven依赖,对于编译和测试classpath有效,但在运行classpath无效。典型的例子:servlet-api,编译和测试的时候需要该依赖,但是运行项目的时候,由于容器已经提供(例如Tomcat中lib下已经有servlet-api.jar包),就不需要maven再重复引入。
④ runtime:运行时依赖范围。使用此依赖范围的maven依赖,对于运行和测试classpath有效,但在编译classpath无效。典型例子:JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
⑤ system:系统依赖范围。该依赖与三种classpath的关系,与provided依赖范围完全一致。但是使用system范围的依赖时必须通过<systemPath>元素显式地指定依赖文件的路径。由于此类依赖不是通过maven仓库解析的,而且往往是与本机系统绑定,可能造成构件的不可移植性,所以要谨慎使用。例:
<dependency>
<groupId>kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<scope>system</scope>
<version>2.3.2</version>
<systemPath>${basedir}\src\lib\kaptcha-2.3.2.jar</systemPath>
</dependency>
总结关系图: