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