maven是一个项目管理工具,主要作用是在项目开发阶段对Java项目进行依赖管理和项目构建。 依赖管理:就是对jar包的管理,通过导入maven坐标,就相当于将仓库中的jar导入了当前项目中 项目构建:通过maven的一个命令就可以完成项目从清理、编译、测试、报告、打包、部署整个过程。

maven的仓库类型:

  1. 本地仓库
  2. 远程仓库
    1. maven中央仓库
    2. maven私服(公司局域网内的仓库)
    3. 其他公共远程仓库

查找的顺序:本地仓库 -> maven 私服 -> maven中央仓库

maven的常用命令:
clean:清理
compile:编译
test:测试
package:打包(war或jar包)
install:安装

Maven 依赖传递

在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A、项目B以及项目C。项目C依赖项目B,项目B依赖项目A,那么就可以说项目C也依赖传递了项目A。项目C既可以用到项目B中的资源,也可以用到项目A中的资源。

image.png
image.png

解决依赖冲突

如何解决依赖冲突问题?
如下图所示,产生了依赖冲突,spring-beans的依赖存在5.1.5和5.1.6的版本
image.png
但是项目真正依赖的beans的版本是5.1.5的。而我们希望引入工程中的beans是5.1.6的版本要如何做呢?
image.png
依赖冲突:由于依赖传递所引起的一个问题,在同一个工程中依赖传递了不同版本的相同jar包

如果解决依赖冲突:

  1. 使用maven提供的依赖调解原则
    1. 第一声明者优先原则
    2. 路径近者优先原则
  2. 排除依赖
  3. 锁定版本

    第一声明者优先原则 【不常用】

    如下,按照写入顺序为准,所以spring-beans就是5.1.5版本,如果要想使用5.1.6的版本则将spring-aop放在spring-mvc上面即可。

    1. <dependency>
    2. <groupId>org.springframework</groupId>
    3. <artifactId>spring-webmvc</artifactId>
    4. <version>5.1.5.RELEASE</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.springframework</groupId>
    8. <artifactId>spring-aop</artifactId>
    9. <version>5.1.6.RELEASE</version>
    10. </dependency>

    路径近者原则

    直接依赖beans,大于依赖传递

         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-webmvc</artifactId>
             <version>5.1.5.RELEASE</version>
         </dependency>
         <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>
             <version>5.1.7.RELEASE</version>
         </dependency>
    

    直接依赖大于传递依赖,所以在工程中直接使用的beans就是5.1.7版本。
    image.png

    排除依赖

    可以使用exclusions标签将传递依赖直接排除出去。

         <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>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-aop</artifactId>
             <version>5.1.6.RELEASE</version>
         </dependency>
    

    我们可以看到 spring-mvc的依赖中的spring-beans已经没有了
    image.png

    锁定版本 【重点掌握】

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

  4. dependencyManagement标签中锁定依赖的版本,并不能将依赖引入工程中.

     <!-- 锁定jar包版本 -->
     <dependencyManagement>
         <dependencies>
             <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-beans</artifactId>
                 <version>5.1.7.RELEASE</version>
             </dependency>
             <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-context</artifactId>
                 <version>5.1.7.RELEASE</version>
             </dependency>
         </dependencies>
     </dependencyManagement>
    
  5. dependencies 标签中声明需要导入的maven坐标,无需在指定版本了

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

    这样我们在工程中的依赖版本就可以得到统一
    image.png

    properties 标签

    在我们实际开发中,在dependencyManagement 指定jar包的版本,如果依赖过多,后期要升级版本,就需要一个一个的去修改,难以维护.所以需要在properties标签中 配置统一的一个类似变量的版本号

     <properties>
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.target>8</maven.compiler.target>
         <!-- 配置统一的版本 -->
         <spring.version>5.1.8.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>
    

    Maven 聚合工厂-分模块

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

常见的拆分方式:

  1. 按照业务模块进行拆分,每个模块拆分成一个maven工程,例如将一个项目分为用户模块、订单模块、购物车模块等,每个模块对应就是一个maven工程。
  2. 按照层进行拆分,例如持久层、业务层、表现层、每个层对应一个maven工程。

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

Maven 聚合工程 - 图8maven_pojo:存放的是实体类
maven_dao:存放的数据库交互代码
maven_service: 存放的是业务逻辑代码
maven_web: 接收请求和响应、视图跳转
image.png

maven工程的继承

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

父工程的打包方式一般都为pom.
新建项目,创建一个名为:maven_parent 模块
pom.xm如下代码:packaging

<?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.prim</groupId>
    <artifactId>maven_parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

父工程,通常都是进行管理jar包版本和依赖,如下代码:

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring.version>5.1.5.RELEASE</spring.version>
    </properties>

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

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

创建子工程maven_pojo,继承的父工程maven_parent
image.png
看一下子工程的pom文件:子工程通过parent标签继承父工程

    <parent>
        <artifactId>maven_parent</artifactId>
        <groupId>com.prim</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

子工程就可以使用父工程引入的依赖包:
image.png

maven 工程的聚合

在maven工程的pom.xml文件中可以使用<modules>标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作。
例如:拆分后的maven工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来非常繁琐。这时就可以使用<modules>标签将这些工程统一聚合到maven父工程中,需要打包的时候,只需要在此工程中执行一次打包命令,其下被聚合的工程就都会被打包了。
在父工程的pom文件中添加module 聚合子工程:

    <modules>
        <module>maven_pojo</module>
    </modules>

运行mvn package,我们可以看到maven_pojo也进行了打包
image.png