2.4.11 Maven高级, 依赖传递/冲突/调节/排除,版本锁定, properties标签, 聚合工程(分模块), 继承/ 聚合

目录

Maven

1.Maven基础(已学习)

2.Maven高级

2.1 maven基础知识回顾

2.1.1 maven介绍

2.1.2 maven的仓库类型

2.1.3 maven常用命令

2.1.4 maven坐标书写规范

2.2 maven的依赖传递

2.2.1 什么是依赖传递

2.2.2 如何解决依赖冲突

2.2.3 依赖调节原则——第一声明者优先原则(了解)

2.2.4 依赖调节原则——路径近者优先原则

2.2.5 排除依赖

2.2.6 版本锁定

2.2.7 properties标签的使用

2.3 maven聚合工程(分模块)

2.3.1 分模块构建maven工程分析

2.3.2 maven工程的继承

2.3.3 maven工程的聚合

2.3.3 maven聚合工程_搭建拉勾教育后台管理系统


Maven

1.Maven基础(已学习)

2.Maven高级

2.1 maven基础知识回顾

2.1.1 maven介绍

maven 是一个项目管理工具,主要作用是在项目开发阶段对Java项目进行依赖管理和项目构建。

依赖管理:就是对jar包的管理。通过导入maven坐标,就相当于将仓库中的jar包导入了当前项目中。

项目构建:通过maven的一个命令就可以完成项目从清理、编译、测试、报告、打包,部署整个过程。

2.1.2 maven的仓库类型

1.本地仓库

2.远程仓库
①maven中央仓库(地址:http://repo2.maven.org/maven2/
②maven私服(公司局域网内的仓库,需要自己搭建)
③其他公共远程仓库(例如apache提供的远程仓库,地址:http://repo.maven.apache.org/maven2/

本地仓库---》maven私服---》maven中央仓库

2.1.3 maven常用命令

clean: 清理
compile:编译
test: 测试
package:打包
install: 安装

2.1.4 maven坐标书写规范

2.2 maven的依赖传递

2.2.1 什么是依赖传递

在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。

通过上面的图可以看到,我们的web项目直接依赖了spring-webmvc,而spring-webmvc依赖了sping-aop、spring-beans等。最终的结果就是在我们的web项目中间接依赖了spring-aop、spring-beans等。

依赖冲突

由于依赖传递现象的存在, spring-webmvc 依赖 spirng-beans-5.1.5,spring-aop 依赖 spring-beans-5.1.6,但是发现 spirng-beans-5.1.5 加入到了工程中,而我们希望 spring-beans-5.1.6 加入工 程。这就造成了依赖冲突。

2.2.2 如何解决依赖冲突

1.使用maven提供的依赖调解原则

    第一声明者优先原则
       路径近者优先原则

2.排除依赖

3.锁定版本

2.2.3 依赖调节原则——第一声明者优先原则(了解)

在 pom 文件中定义依赖,以先声明的依赖为准。其实就是根据坐标导入的顺序来确定最终使用哪个传递过来的依赖。


结论:通过上图可以看到,spring-aop和spring-webmvc都传递过来了spring-beans,但是因为spring-aop在前面,所以最终使用的spring-beans是由spring-aop传递过来的,而spring-webmvc传递过来的spring-beans则被忽略了。

2.2.4 依赖调节原则——路径近者优先原则

总结:直接依赖大于依赖传递

2.2.5 排除依赖

可以使用exclusions标签将传递过来的依赖排除出去。

2.2.6 版本锁定

采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本为准添加到工程中,此方法在企业开发中经常使用。

版本锁定的使用方式:

第一步:在dependencyManagement标签中锁定依赖的版本

第二步:在dependencies标签中声明需要导入的maven坐标

①在dependencyManagement标签中锁定依赖的版本

②在dependencies标签中声明需要导入的maven坐标

2.2.7 properties标签的使用

方便修改各种相关依赖的版本

<?xml version="1.0" encoding="UTF-8"?>

<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/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>com.lagou</groupId>  
  <artifactId>maven_advanced</artifactId>  
  <version>1.0-SNAPSHOT</version>  
  <packaging>war</packaging>

  <!--抽取版本号, 以后修改方便-->
  <properties> 
    <spring.version>5.1.7.RELEASE</spring.version> 
  </properties>

  <!--锁定jar包版本-->  
  <dependencyManagement> 
    <dependencies> 
      <dependency> 
        <groupId>org.springframework</groupId>  
        <artifactId>spring-beans</artifactId>  
        <version>${spring.version}</version> 
      </dependency>  
      <dependency> 
        <groupId>org.springframework</groupId>  
        <artifactId>spring-context</artifactId>  
        <version>${spring.version}</version> 
      </dependency> 
    </dependencies> 
  </dependencyManagement>  
  <dependencies> 
    <!--  &lt;!&ndash;spring mvc&ndash;&gt;
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-webmvc</artifactId>
              <version>5.1.5.RELEASE</version>
              <exclusions>
                  <exclusion>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-beans</artifactId>
                  </exclusion>
              </exclusions>

          </dependency>

          &lt;!&ndash;spring aop&ndash;&gt;
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-aop</artifactId>
              <version>5.1.6.RELEASE</version>
          </dependency>-->

    <!--下面不用配置版本号, 因为上面已经锁定了-->
    <dependency> 
      <groupId>org.springframework</groupId>  
      <artifactId>spring-beans</artifactId> 
    </dependency> 
  </dependencies> 
</project>

 

2.3 maven聚合工程(分模块)

概念:

在现实生活中,汽车厂家进行汽车生产时,由于整个生产过程非常复杂和繁琐,工作量非常大,所以厂家都会将整个汽车的部件分开生产,最终再将生产好的部件进行组装,形成一台完整的汽车。

2.3.1 分模块构建maven工程分析

在企业项目开发中,由于项目规模大,业务复杂,参与的人员比较多,一般会通过合理的模块拆分将一个大型的项目拆分为N多个小模块,分别进行开发。而且拆分出的模块可以非常容易的被其他模块复用

常见的拆分方式有两种:
第一种:按照业务模块进行拆分,每个模块拆分成一个maven工程,例如将一个项目分为用户模块,订
单模块,购物车模块等,每个模块对应就是一个maven工程
第二种:按照层进行拆分,例如持久层、业务层、表现层等,每个层对应就是一个maven工程

不管上面那种拆分方式,通常都会提供一个父工程,将一些公共的代码和配置提取到父工程中进行统一管理和配置。

2.3.2 maven工程的继承

在Java语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非private的属性和方法。同样,在maven工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的目的是为了消除重复代码。

父工程一般不编写代码, 只用来进行资源 统一管理 

2.3.3 maven工程的聚合

在maven工程的pom.xml文件中可以使用标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作。

例如拆分后的maven工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来非常繁琐。

这时就可以使用 <modules> 标签将这些工程统一聚合到maven父工程中,需要打包的时候,只需要在此工程中执行一次打包命令,其下被聚合的工程就都会被打包了。

2.3.3 maven聚合工程_搭建拉勾教育后台管理系统

工程整体结构如下:

1)lagou_edu_home_parent为父工程,其余工程为子工程,都继承父工程lagou_edu_home_parent

2)lagou_edu_home_parent工程将其子工程都进行了聚合

3)子工程之间存在依赖关系:

ssm_domain依赖ssm_utils

ssm_dao依赖ssm_domain

ssm_service依赖ssm_dao

ssm_web依赖ssm_service

父工程

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lagou</groupId>
    <artifactId>maven-parent</artifactId>
    <!--pom打包类型-->
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <!--聚合所有工程-->
    <modules>
        <module>maven-domain</module>
        <module>maven_dao</module>
        <module>maven-service</module>
        <module>maven-web</module>
    </modules>
</project>

子工程

①domain层

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

    <!--代表本工程的父工程-->
    <parent>
        <artifactId>maven-parent</artifactId>
        <groupId>com.lagou</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven-domain</artifactId>
    
</project>

②dao层

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

    <!--代表本工程的父工程-->
    <parent>
        <artifactId>maven-parent</artifactId>
        <groupId>com.lagou</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven_dao</artifactId>

    <!--引入domain层的依赖-->
    <dependencies>
        <dependency>
            <groupId>com.lagou</groupId>
            <artifactId>maven-domain</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

③service层

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

    <!--代表本工程的父工程-->
    <parent>
        <artifactId>maven-parent</artifactId>
        <groupId>com.lagou</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven-service</artifactId>

    <!--引入dao层的依赖-->
    <dependencies>
        <dependency>
            <groupId>com.lagou</groupId>
            <artifactId>maven_dao</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

④web层

<?xml version="1.0" encoding="UTF-8"?>

<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/xsd/maven-4.0.0.xsd">  

  <!--代表本工程的父工程-->
  <parent> 
    <artifactId>maven-parent</artifactId>  
    <groupId>com.lagou</groupId>  
    <version>1.0-SNAPSHOT</version> 
  </parent>  
  <modelVersion>4.0.0</modelVersion>  
  <artifactId>maven-web</artifactId>
  <packaging>war</packaging>

  <!--引入service层的依赖-->
  <dependencies>
    <dependency>
      <groupId>com.lagou</groupId>
      <artifactId>maven-service</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>
  </dependencies>
</project>

猜你喜欢

转载自blog.csdn.net/chengh1993/article/details/110824395