遇一山,过一山,处处有风景;只要勇敢向前,一路尽是繁花盛开。 | (点击查看→)【测试干货】python/java自动化、持续集成、性能、测开、简历、笔试面试等

maven生命周期及命令用法、maven工程中依赖的传递及依赖冲突的解决

生命周期

一个项目的构建build的过程通常包括:清理、编译、测试、打包、部署等

Maven定义了三套生命周期:

  clean:处理项目的清理工作,主要命令是clean

  default:处理项目的deploy,主要命令:compile、test、package、install

  site:处理网站站点的创建,主要命令:site

 

命令用法

  每个生命周期之间是互相独立,比如:直接执行package,不会执行clean

  每个生命周期内都包含多个阶段,这些阶段是有顺序的,后续的阶段必须等待前面的阶段执行后才能执行(一个生命周期内,比如default阶段,执行package,会执行前面的compile、test,再执行package,可以简写为:package;一般是再加上前一个生命周期clean,所以简写为:clean package)

  不执行测试用例:mvn clean package -Dmaven.test.skip=true

 

自定义maven命令

 

 

 

 

maven中scope

scope在maven的依赖管理中主要负责项目的部署,scope的分类:

1.compile:默认值,他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去

2.test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit

3.runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段

4.provided:打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作

5.system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径

 

依赖传递

创建一个maven工程

 

依赖

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.14.RELEASE</version>
    </dependency>
  </dependencies>

  

下面出现了spring-webmvc以外的其他jar。那是因为我们的项目依赖spring-webmvc.jar,而spring-webmvc.jar会依赖spring-beans.jar等等,所以spring-beans.jar等jar包也出现在了我们的maven工程中, 这种现象我们称为依赖传递。从下图中可看到他们的关系:

 

查看依赖

 

  

依赖冲突的解决

在pom中,spring-webmvc下再添加一个spring-context的依赖

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.14.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.18</version>
    </dependency>
  </dependencies>

  

 

omitted for duplicate表示和别的jar包版本冲突了,而该jar包不被引入

 

下面红色的就是被忽略的

 

 

我们会发现这两个jar包同时都依赖了spring-beans,但是spring-webmvc依赖spring-beans是4.3.14.RELEASE,spring-context依赖spring-beans是5.3.18,但是发现spring-beans:4.3.14.RELEASE加入到工程中。而我们希望spring-beans:5.3.18加入工程,这就造成了依赖冲突。

解决依赖冲突有以下原则: 

依赖调解原则

maven自动按照下边的原则调解:

1、第一声明者优先原则

在 pom 文件定义依赖, 先声明的依赖为准。

测试:

如果将上边spring-webmvc和spring-context顺序交换一下,系统将导入spring-beans:5.3.18

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.18</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.14.RELEASE</version>
    </dependency>
  </dependencies>

 

 

 

2、路径近者优先原则

例如: 还是上述情况,spring-contex和spring-webmvc都会传递过来spring-beans,那如果直接把spring-beans的依赖直接写到pom文件中, 那么项目就不会再使用其他依赖传递来的spring-beans,因为自己直接在pom中定义spring-beans要比其他依赖传递过来的路径要近(人工直接声明的优先)。

根据路径近者优先原则,系统将导入spring-beans:5.3.18

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.14.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.18</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.3.18</version>
    </dependency>
  </dependencies>

  

 

 

依赖排除

上边的问题也可以通过排除依赖方法辅助依赖调解,如下:

比如在依赖spring-webmvc的设置中添加排除依赖,排除spring-beans,

下边的配置表示:依赖spring-webmvc,但排除spring-webmvc所依赖的spring-beans。

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.14.RELEASE</version>
      <exclusions>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.18</version>
    </dependency>
  </dependencies>

  

 

 

锁定版本

面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素,可以采用直接锁定版本的方法确定依赖构建的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。如下的配置是锁定了spring-webmvc和spring-context的版本: 

用dependencyManagement管理项目中的依赖

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.14.RELEASE</version>
      </dependency>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.14.RELEASE</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

 

但是,依赖都没了

 

 

我们还可以把版本号提取出来,使用标签设置成变量。

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>4.3.14.RELEASE</spring.version>
  </properties>


  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

 

在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加<dependencies></dependencies>标签,但是不需要再指定版本,因为已在 <dependencyManagement> 中锁定了版本,如下:

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>4.3.14.RELEASE</spring.version>
  </properties>


  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
    </dependency>
  </dependencies>

 

原文会持续更新,原文地址:https://www.cnblogs.com/uncleyong/p/16820993.html

 

posted @ 2022-10-24 20:10  全栈测试笔记  阅读(425)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end