Maven版本控制

刘润森

共 4842字,需浏览 10分钟

 ·

2023-05-08 08:40

Maven

传递性依赖是Maven2.0的新特性。假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖库的项目文件实现的。一般的,这些项目的所有依赖都会加入到项目中,或者从父项目继承,或者通过传递性依赖。

如果A依赖了B,那么C依赖A时会自动把A和B都导入进来。

7fcb8d57a69536adb0a7f45aea84830b.webp

创建A项目后,选择IDEA最右侧Maven面板lifecycle,双击install后就会把项目安装到本地仓库中,其他项目就可以通过坐标引用此项目。

【1】第一原则:最短路径优先原则

“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。

例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0)  和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短。

【2】第二原则:最先声明原则

依赖路径长度是一样的的时候,第一原则不能解决所有问题,比如这样的依赖关系:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。那么到底谁会被解析使用呢?在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。

exclusions: 用来排除传递性依赖 其中可配置多个exclusion标签,每个exclusion标签里面对应的有groupId, artifactId, version三项基本元素。注意:不用写版本号     比如:A--->B--->C (Mybatis.jar) 排除C中的Mybatis.jar

fea7f4cefc97bcc7cd06218431e54459.webpimg

继承关系:

如果A工程继承B工程,则代表A工程默认依赖B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。

被继承的工程(B工程)只能是POM工程。


在父项目中放在<dependencyManagement>中的内容时不被子项目继承,不可以直接使用

放在<dependencyManagement>中的内容主要目的是进行版本管理。里面的内容在子项目中依赖时坐标只需要填写

<group id><artifact id>即可。(注意:如果子项目不希望使用父项目的版本,可以明确配置version)。

d9167bde5491105be0ba61e2303a2d71.webp

当我们开发的工程拥有2个以上模块的时候,每个模块都是一个独立的功能集合。比如某大学系统中拥有搜索平台,学习平台,考试平台等。开发的时候每个平台都可以独立编译,测试,运行。这个时候我们就需要一个聚合工程。

在创建聚合工程的过程中,总的工程必须是一个POM工程(Maven Project)(聚合项目必须是一个pom类型的项目,jar项目war项目是没有办法做聚合工程的),各子模块可以是任意类型模块(Maven Module)。

前提:继承。

聚合包含了继承的特性。

聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为pom类型。同时在父项目的pom.xml中出现表示包含的所有子模块。

总项目:一般总项目:POM项目

f5e0eea8f08391168f287ffeb9746e6f.webpb81c3a9e24d911381042c689b3891594.webp

常见插件

  • 通过编译器插件,我们可以配置使用的JDK或者说编译器的版本
  • settings.xml文件中配置全局编译器插件:
7abe753297199c047fe8929a319797cc.webp95c8a8af235d166053c8a51707927b1c.webp

Maven在打包时默认只将src/main/resources里的配置文件拷贝到项目中并做打包处理,而非resource目录下的配置文件在打包时不会添加到项目中。

我们的配置文件,一般都放在:src/main/resources

然后打包后配置文件就会在target的classes下面放着:

9157128f17493eef075d775fcf0eedbf.webpcf822200091ef1bdadb905d9131bde34.webp

现在学习一个新的方式,不再依赖外部的tomcat,maven提供了tomcat插件,我们可以配置来使用。

创建web项目:war项目:

maven项目pom.xml中parent标签的使用

使用maven是为了更好的帮项目管理包依赖,maven的核心就是pom.xml。当我们需要引入一个jar包时,在pom文件中加上就可以从仓库中依赖到相应的jar包。

  • 现在有这样一个场景,有两个web项目A、B,一个java项目C,它们都需要用到同一个jar包:common.jar。如果分别在三个项目的pom文件中定义各自对common.jar的依赖,那么当common.jar的版本发生变化时,三个项目的pom文件都要改,项目越多要改的地方就越多,很麻烦。这时候就需要用到parent标签, 我们创建一个parent项目,打包类型为pom,parent项目中不存放任何代码,只是管理多个项目之间公共的依赖。在parent项目的pom文件中定义对common.jar的依赖,ABC三个子项目中只需要定义,parent标签中写上parent项目的pom坐标就可以引用到common.jar了。

  • 我们在切换一个场景,有一个springmvc.jar,只有AB两个web项目需要,C项目是java项目不需要,那么又要怎么去依赖。如果AB中分别定义对springmvc.jar的依赖,当springmvc.jar版本变化时修改起来又会很麻烦。解决办法是在parent项目的pom文件中使用将springmvc.jar管理起来,如果有哪个子项目要用,那么子项目在自己的pom文件中使用

标签中写上springmvc.jar的坐标,不需要写版本号,可以依赖到这个jar包了。这样springmvc.jar的版本发生变化时只需要修改parent中的版本就可以了。

springboot为什么引入一些依赖时不需要指定版本

  • 其实在Spring Boot 项目下的pom.xml文件中通常都会有一个标签,用来指定继承的父pom

                
                 <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.10.RELEASE</version>
            <relativePath/>
        </parent>

    其实在Spring Boot 项目下的pom.xml文件中通常都会有一个标签,用来指定继承的父pom,如下::

                
                 <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.10.RELEASE</version>
            <relativePath>../../spring-boot-dependencies</relativePath>
        </parent>

    点进去后会发现spring-boot-starter-parent也继承自一个pom,如下:

                
                 <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.10.RELEASE</version>
            <relativePath>../../spring-boot-dependencies</relativePath>
        </parent>

    再点进去就可以看到结果了,顶级的pom文件的坐标如下,通过标签我们应该知道这个pom文件时用来管理依赖版本号的。

                
                  <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>1.5.10.RELEASE</version>
        <packaging>pom</packaging>

    在这个pom.xml中定义了很多的标签用来管理引入依赖和插件的版本。 在引入依赖的时候,即使你不指定依赖的版本,Spring Boot 也会通过Maven 的继承关系,引入依赖的版本,从而完成版本的统一。 另外不是所有依赖都在parent中指定了版本,对于没有指定版本的依赖依然需要手动指定版本否则会出现No version of dendency的异常 当然你也可以不使用Maven继承的依赖版本,只需要在引入依赖的时候指定具体的依赖版本即可.

f5bff0eca0c42bea6032b3979ba0bea5.webp

maven的pom.xml中repositories的作用

在pom.xml中repositories标签的作用是用来配置maven项目的远程仓库。示例如下:

      <repositories>

<repository>

<id>远程仓库唯一标识符</id>

<url>远程仓库的url</url>

</repository>

</repositories>


浏览 78
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报