目录
(3)dependency依赖项下的scope标签... 6
(4)dependency依赖项下的optional标签... 6
(5)dependency依赖项下的exclusions排除依赖标签... 6
(1)dependencyManagement依赖列表... 7
一、pom.xml文件
1、根元素
project标签--->必须标签,表示标签是pom.xml的根元素,它包含了pom文件里面的所有信息,必须元素
<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/maven-v4_0_0.xsd">
</project> |
2、pom版本标签
modelVersion 标签--->必须标签,表示是一个固定的版本,指定了当前pom的版本,必需元素
<modelVersion>4.0.0</modelVersion> |
3、属性标签properties
properties标签--->必须标签,可以在该标签中指定端口,字符集,版本号等属性
<properties>
<port>8080</port> <encoding>UTF-8</encoding> <java.version>1.8</java.version> <warName>familysf</warName> <maven.war.plugin.version>3.1.0</maven.war.plugin.version> <maven.surefire.plugin.version>2.20</maven.surefire.plugin.version> <maven.compiler.plugin.version>3.6.1</maven.compiler.plugin.version> <maven.jetty.plugin.version>9.4.5.v20170502</maven.jetty.plugin.version> <jvm.arg>-Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m -Dfile.encoding=UTF-8</jvm.arg>
</properties> |
4、坐标信息
(1)groupId标签
groupId 标签--->必须标签,表示项目的标识,用于标识当前项目属于哪一个实际的项目,和项目创建的包是一样的
<groupId>com.zxr.maven</groupId> |
(2)artifactId标签
artifactId标签--->必须标签,表示模块标识,会使用实际的项目名+模块名,一般是该项目的项目名
<artifactId>StudyMaven</artifactId> |
(3)packaging标签
packaging标签--->必须标签,表示指定项目的打包方式,不指定,默认为jar ,可以指定为war,zip,pom等
<packaging>war</packaging> |
(4)version标签
version标签--->必须标签,表示当前项目的版本号,一般由三个数字表示,第一个0表示大版本号,第二个0表示分支版本号,第三个0表示小版本号
一般用0.0.1-snapshot,其表示一个版本号为0.0.1的快照版
除了快照版,还有alpha内测版,beta公测版,Release稳定版,GA正式发布版本
<version>0.0.1-SNAPSHOT</version> |
(5)name标签
name标签--->必须标签,表示项目的描述名 在产生文档的时候会使用
<name>StudyMaven Maven Webapp</name> |
(6)url标签
url标签--->必须标签,表示项目的地址
<url>http://maven.apache.org</url> |
(7)description标签
description标签--->非必须标签,表示项目的描述
<description>这里是项目的描述</description> |
(8)developers标签
developers标签--->非必须标签,表示指定的作者
<developers>开发人员列表</developers> |
(9)licenses标签
licenses标签--->非必须标签,表示许可证的信息
<licenses>许可证的信息</licenses> |
(10)organization标签
organization 标签--->非必须标签,表示组织信息
<organization>组织信息</organization> |
5、依赖标签
(1)dependencies依赖列表标签
dependencies 标签--->必须标签,表示里面有多个依赖项
<dependencies>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>
</dependencies> |
(2)dependency依赖项标签
dependency 标签--->必须标签,表示有一个依赖项,里面包括了该依赖项的groupId,artifactId,version等信息(坐标)
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>
|
(3)dependency依赖项下的scope标签
scope 标签--->非必须标签,标签内为test时表示该项依赖(这个jar)只能在test时起到作用,打包编译发布后不起作用
<scope>test</scope> |
(4)dependency依赖项下的optional标签
optional 标签--->非必须标签,表示设置依赖是否可选,默认为false,为false时,表示子项目默认是继承的,如果是true,表示子项目不是继承的,这个子项目必须引入该依赖
<optional>true</optional> |
(5)dependency依赖项下的exclusions排除依赖标签
exclusions标签--->非必须标签,表示排除依赖依赖传递列表,这个标签下面可以排除多个依赖(比如说a依赖于b,b依赖于c,这就是一个传递依赖,但如果a不想依赖c,就可以用这个标签)
<exclusions> <exclusion>
</exclusion> </exclusions> |
6、依赖管理标签
(1)dependencyManagement依赖列表
dependencyManagement 标签--->非必须标签,表示依赖的管理,在他的下面也可以声明依赖列表,存在多个依赖,但是它并不会被运行,就是不会营造实际的依赖,主要用于父模块中定义供子模块使用,比如我们在所有的模块中都用到了Junit,我们就可以抽象出来一个Junit供子模块调用
<dependencyManagement> <dependencies> <dependency>
</dependency> </dependencies> </dependencyManagement> |
7、build标签
build 标签--->必须标签,通常为我们的构建行为提供相应的支持,plugin(插件标签就在其中提供支持)
<build> <finalName>StudyMaven</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${maven.surefire.plugin.version}</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> |
8、parent标签
parent标签--->非必须标签,用于子模块中对父模块的继承
<parent></parent> |
9、modules标签
modules 标签--->非必须标签,用来聚合多个运行的maven项目,如果有很多模块需要编译时,就可以定义多个module,将其聚合编译
<modules></modules> |
二、scope依赖范围
在依赖项dependency标签中,存在依赖的范围,用scope标签来表示范围。
例如
<dependencies>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>
</dependencies> |
在maven中提供了三种classpath分别是编译,测试,运行,上面例子中scope 标签中为test,这就表明该jar包只在测试的classpath中存在,在运行的classpath中不存在。
scope属性值:
compile:默认的范围,在编译测试,运行都有效,在依赖项dependency中不写,也就是不指定scope标签,即表示默认;
provided:在编译和测试的时候有效
runtime:在测试和运行时有效
test:只在测试范围内有效
system:在编译和测试是有效,与本机系统相关联,可移植性差
improt:导入的依赖范围,它只使用在dependencyManagement中,表示从其它的pom中导入dependency的配置。
三、依赖的传递
a依赖于b,b依赖于c,这就是一个传递依赖,对于a和c来说,a就是传递性的依赖了c.
b依赖于c:先将c编译并发布jar到仓库中,然后在b的pom文件中添加c的坐标即可,如果不先将c编译并发布jar到仓库中,直接在b的pom文件中添加c的坐标,在编译b的时候就会报错(找不到c的jar);
a依赖于b:同样先将b编译并发布jar到仓库中,然后在a的pom文件中添加b的坐标即可,如果不先将b编译并发布jar到仓库中,直接在a的pom文件中添加b的坐标,在编译a的时候就会报错(找不到b的jar);
由于maven的传递性,此时在a的引入的依赖(jar)中,就会出现c的jar,这就是传递依赖;
如果a只想依赖b,不想依赖c,此时可以用排除依赖的标签exclusions
<dependencies>
<dependency> <!-- b的坐标 -->
<exclusions> <exclusion> <!-- c的坐标 --> </exclusion> </exclusions>
</dependency>
</dependencies> |
这样在引入b的依赖时,同时排除c的依赖。
四、依赖冲突
如果有A和B同时依赖了同一个不同版本的构建,对于A和B来说,究竟依赖的是哪个构建。
依赖冲突原则:
1、短路优先
优先解析路径较为短的版本
例一:
路径一:A依赖B依赖C依赖X(jar v-2.0)
路径二:A依赖D依赖X(jar v-2.4)
以上两个路径会优先解析路径二。
例二:
路径一:A依赖X(jar v-2.0)
路径二:B依赖A依赖X(jar v-2.4)
现有:C依赖B
在C中会解析2.4版本的X(jar v-2.4),因为C离B近,C离A中间还有一个B,根据短路优先所以会先解析2.4版本
2、先声明,先优先
在路径相同的情况下,谁先声明,先解析谁。
比如说
路径一:A依赖X(jar v-2.0)
路径二:B依赖X(jar v-2.4)
现有:C同时依赖了B和A,此时两个依赖的路径都相同,在pom文件中引入依赖的时候,如果先引入(声明)A的坐标,在引入(声明)B的坐标,则先解析的是A中依赖的X(jar v-2.0);如果先引入(声明)B的坐标,在引入(声明)A的坐标,则先解析的是B中依赖的X(jar v-2.4);
五、聚合和继承
1、聚合
将需要编译的多个模块(项目),同时编译,使用聚合。
例:
maven项目一:A
maven项目二:B
maven项目三:C
现需要同时编译,使用聚合
①创建一个maven项目D
②修改maven项目D的pom.xml文件中的<packaging>war</packaging>标签,将packaging标签内war改为pom;<packaging>pom</packaging>
③添加modules标签
<modules>
<module>../A</module>
<module>../B</module>
<module>../C</module>
</modules>
④编译打包项目D,即可完成ABC同时编译打包
2、继承
将多个项目同时用到的jar,整合到一个空项目的pom中(该空项目无java代码及包,无测试代码及包),提供需要用到的项目继承调用。
①创建一个父类项目,修改maven项目A的pom.xml文件中的<packaging>war</packaging>标签,将packaging标签内war改为pom;<packaging>pom</packaging>
在父类使用dependencyManagement标签,将需要作为父类的依赖坐标(这里用Junit测试)放入该标签内;
在其他项目B需要调用到该项目的jar时,通过parent继承父类的pom,也就是在子类的pom.xml中的parent标签先引入父类的坐标即可