pom.xml文件解析及特性

目录

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

一、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 ,可以指定为warzip,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 标签--->必须标签,表示有一个依赖项,里面包括了该依赖项的groupIdartifactIdversion等信息(坐标)

<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,这就是一个传递依赖,对于ac来说,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标签先引入父类的坐标即可

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值