Jar包管理工具Maven-高级篇

449 阅读3分钟

一、 Maven的依赖传递

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

  • 优点:减少坐标的编写
  • 缺点:可能会造成版本冲突

二、如何解决依赖冲突

2.1 依赖调节原则

① 第一声明优先原则

  • 在 pom 文件中定义依赖(坐标),谁先声明就用谁

② 路径近者优先原则

  • 在pom 文件中定义依赖(坐标),谁的路径近就用谁

2.2 排除依赖

  • 通过在pom文件,通过 exclusions 标签排不需要的依赖jar包

2.3 版本锁定

在pom文件中,直接指定项目依赖的所有版本号,导入依赖的时候就不需要指定版本

  1. properties中定义所有的公共版本号常量
  2. 通过dependencyManagement锁定版本号:不会导入依赖jar包
  3. dependencies导入依赖:不需要指定版本号
<?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>net.csjava</groupId>
    <artifactId>maven-helloworld</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--
        集中声明和管理项目依赖的jar版本信息
    -->
    <properties>
        <spring.version>5.1.5.RELEASE</spring.version>
        <junit.version>4.13</junit.version>
    </properties>

    <!--介绍和演示maven解决jar冲突之:版本锁定   架构师、技术经理  -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${spring.version}</version>
            </dependency>

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

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>

            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.3</version>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--jar依赖操作 程序猿 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
    </dependencies>

</project>

三、Maven分模块构建

3.1 什么是分模块构建

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

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

常见的拆分方式有两种:

  • 按照业务模块进行拆分,例如将一个项目分为用户模块、订单模块、购物车模块等,每个模块对应就是一个maven工程
  • 按照进行拆分,例如持久层、业务层、表现层等,每个层对应就是一个maven工程不管是上面哪种拆分方式,通常都会提供一个父工程,将一些公共的代码和配置提取到父工程中进行统一管理和配置。

3.2 maven工程继承

在Java语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非private的属性和方法。

同样,在maven工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的目的是为了消除重复代码

① 创建父工程

<!--父工程引入坐标-->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.5.RELEASE</version>
    </dependency>
</dependencies>

② 创建子(工程)模块

image.png

3.3 maven工程聚合

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

注意:继承和聚合本质上没啥关系,通常情况下父工程会聚合管理的子模块(工程)

3.4 创建子模块方式

image.png image.png