深度了解Maven

简介: 一.Maven介绍与功能 二.依赖管理 1.依赖的配置 2.依赖的传递性 3.排除依赖 4.依赖的作用范围 5.依赖的生命周期

一.Maven介绍与功能

maven是一个项目管理和构建工具,是基于对象模型POM实现。

Maven的作用:

    • 便捷的依赖管理:使用Maven可以简化依赖管理过程。通过在项目的pom.xml文件中声明依赖关系,Maven可以自动下载所需的依赖库,并将它们添加到项目的类路径中。这消除了手动下载和配置jar包的繁琐过程,使依赖管理更加方便和可靠。
    • 统一的项目结构:Maven定义了标准的项目结构,规定了源代码、资源文件、测试代码等目录的布局方式。这使得不同IDE(如Eclipse、IntelliJ IDEA)之间可以共享和识别相同的项目结构,简化了项目之间的迁移和协作。
    • 标准的项目构建流程:Maven提供了一套标准化的项目构建流程。通过执行Maven命令,可以进行项目的编译、测试、打包、部署等一系列操作。这种标准化的构建流程确保了项目的一致性和可重复性,提高了开发效率。

    image.gif编辑


    二.依赖管理

    1.依赖的配置

    所谓的依赖指的就是当前项目所需要的jar包,一个项目可以引入多个jar包

    案例:导入多个包 mysql、ch.qos.logback两个包

    首先打开maven项目工程找到pom.xml

    设置依赖标签

    <!--    设置标签依赖-->
        <dependencies>
    <!--        设置具体依赖-->
            <dependency>
    <!--            配置代表项目或组织的唯一标识符-->
                <groupId>ch.qos.logback</groupId>
    <!--            配置代表特定项目的唯一标识符-->
                <artifactId>logback-classic</artifactId>
    <!--            配置版本号-->
                <version>1.2.3</version>
            </dependency>
    <!--        操作类似-->
            <dependency>
                <groupId>mysql-java</groupId>
                <artifactId>mysql-java</artifactId>
                <version>5.1.21</version>
            </dependency>
        </dependencies>

    image.gif

    如果以前没有使用过相关jar包,则会冒红报错,因为在本地仓库没有找到相关的jar包

    image.gif编辑


    2.依赖的传递性

    如果一个项目projectA依赖了一个A-jar包,而一个A-jar包中又依赖了其他的jar包,那么projectA对应的也就依赖了A-jar包对应的其他jar包

    image.gif编辑

    依赖传递有两种:一种是直接依赖,一种是间接依赖

    image.gif编辑

    通过图标形势查看依赖关系

    在pom中右键找到图再点击显示依赖项

    image.gif编辑

    这样就可以清晰看到项目之间的依赖

    image.gif编辑 当然依赖可能会产生一个特殊情况,A->B->A 循环依赖,项目A依赖了项目B,而项目B依赖了项目A。这种情况也是面试题常问的一个问题

    面试题:Maven中如何解决依赖循环的问题

      1. 重构代码结构:首先,我们可以检查项目结构并尝试重构代码以消除依赖循环。这可能需要重新设计模块之间的关系,将公共功能提取到独立的模块中,或者修改模块的依赖关系,以确保它们形成一个有向无环图(DAG)。
      2. 使用接口或抽象类:如果依赖循环是由于具体类之间的相互依赖引起的,我们可以考虑使用接口或抽象类来解耦它们。这样,依赖关系将变得单向,并且可以更容易地管理。
      3. 使用Maven插件:Maven提供了一些插件来帮助解决依赖循环问题。例如,可以使用Maven的maven-dependency-plugin来分析项目依赖关系,并找出导致循环的依赖。然后,我们可以使用excludeoptional标记,将其中一个模块的依赖排除或设置为可选,以打破循环。
      4. 模块拆分:另一种方法是将存在依赖循环的模块拆分为更小的、相互独立的模块。这样,我们可以将它们放在不同的项目中,并使用Maven的多模块项目进行管理。通过将功能划分到不同的模块中,可以更好地管理和控制它们之间的依赖关系。

      3.排除依赖

      由上面的内容可以知道依赖具有传递性,PorjectA项目会依赖A-jar包下的所有依赖jar包。但是如果明确知道工程ProjectA中只需要A-jar包,不需要A-jar包下的某一个包,则可以通过<exclustions>标签和<exclustion>实现排除依赖

      <exclusions>
         <exclusion>
               <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
          </exclusion>
       </exclusions>

      image.gif

      image.gif编辑

      可以看到用了排除依赖后相关jar包就不存在了image.gif编辑


      4.依赖的作用范围

      依赖的jar包,在默认情况下,可以在任何地方使用,或者也可以通过<scope></ scope>标签来设置相应jar包的作用范围

      作用范围:

        • 主程序范围有效(main文件夹内)
        • 测试程序范围有效(test文件夹范围内)
        • 是否参与打包运行(package指令范围内)

        image.gif编辑

        scope标签值与对应的作用范围

        image.gif编辑

        案例:

        设置logback的jar包的范围为test,实现只能在test测试程序中运行

        image.gif编辑

        注意不要忘了点击更新

        image.gif编辑

        接下来测试是否更改了作用范围:

        1.在test中使用logback的jar包对象,可以看到有提示相应的jar包

        image.gif编辑

        2.在main中使用则会发现并没有相应的jar包

        image.gif编辑


        5.依赖的生命周期

        在Maven中有三套相互独立的生命周期

          • clean 负责清理上一次编译产生的字节码文件
          • default 核心工作 负责编译、测试、打包、安装、部署等等
          • site 生成报告、发布站点等

          每一套生命周期都有许多的生命周期阶段,但是我们需要用到的生命周期并不需要太多,只需要掌握以下几个核心生命周期的阶段即可

          核心的生命周期阶段

            • clean 移除上一次构建生成的文件
            • compile编译项目的源代码
            • test使用合适的单元测试框架运行测试
            • package将编译后的文件进行打包
            • install安装项目到本地仓库

            image.gif编辑

            注意:同一套的生命周期的运行是由循序的,后面的生命周期的运行是需要依赖前面的生命周期的运行。所以如果使用后面的生命周期阶段,就会自动执行前面的生命周期

            比如运行test,会自动运行validate与compile,但是不会运行clean,因为clean与这些不是同一套的生命周期

            运行指定的生命周期

            有两种方式运行指定的生命周期

            第一种,找到右侧栏中的maven打开项目下的生命周期,找到对应周期双击运行即可

            image.gif编辑

            第二种,在idea或者cmd中输入指令 mvn xxx即可执行对应的生命周期阶段

            image.gif编辑

            周期跳过

            在工程文件中找到生命周期,找到小闪电图标,点击即可跳过对应的生命周期。

            image.gif编辑


            目录
            相关文章
            |
            Java Maven
            maven篇4:pom文件详解
            maven篇4:pom文件详解
            1011 3
            |
            3月前
            |
            缓存 Java 数据库
            【Spring Boot】Spring Boot 全体系知识结构化拆解(附 Spring Boot 高频面试八股文精简版)
            Spring Boot 是 Pivotal 基于 Spring 的“约定大于配置”快速开发框架,简化初始搭建与开发,无缝整合 Spring 全生态,内嵌容器、自动配置、起步依赖开箱即用,是 Java 企业级应用与微服务架构的核心基石。
            1389 8
            |
            存储 分布式计算 负载均衡
            【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)
            【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)
            2017 0
            |
            2月前
            |
            弹性计算 关系型数据库 开发者
            计算机毕设技术选型实战:Django/Flask/FastAPI深度对比与云原生部署方案
            2026届毕设技术选型需直面查重升级、答辩提标、周期压缩三大变化。本文深度对比Django/Flask/FastAPI在学习成本、云部署(阿里云ECS/RDS/OSS/ACK)、论文友好度等维度表现,提供场景化决策树、真实部署脚本及成本优化方案,助你高效通关。
            |
            9月前
            |
            机器学习/深度学习 数据采集 缓存
            蛋白质结构预测:从AlphaFold到未来的计算生物学革命
            蒋星熠Jaxonic以“摘星者”视角,融合深度学习与几何工程,详解蛋白质结构预测的模块化实践。从序列到三维结构,贯穿可解释性、轻量架构与性能权衡,助力科研与工业落地。
            |
            Java 应用服务中间件 项目管理
            Maven详解
            Apache Maven是一个强大的Java项目管理和构建工具,它简化了项目结构、依赖管理、构建过程。Maven遵循约定优于配置原则,提供标准项目模板,自动处理依赖下载和版本控制。通过POM(Project Object Model)文件,开发人员声明项目属性、依赖、构建配置等。Maven支持多模块管理、文档生成、版本管理和构建报告。使用Maven,可以更高效地管理复杂项目,避免手动管理依赖带来的问题。此外,Maven的配置文件(settings.xml)允许设置本地仓库、中央仓库镜像和JDK版本等。
            985 1
            Maven详解
            |
            XML 前端开发 Java
            怎样将MultipartFile和File互转
            该文介绍了如何在Java开发中优雅地转换MultipartFile和File。MultipartFile是Spring框架用于接收上传文件的类,而File是操作系统文件的代表。文章提供了三种将MultipartFile转换为File的方法:使用`transferTo`方法、FileOutputStream和Java NIO。另外,还介绍了在测试场景下将File转换为MultipartFile,通过MockMultipartFile实现。
            2162 1
            |
            存储 IDE Java
            Java“NoClassDefFoundError”解决
            Java中的“NoClassDefFoundError”错误通常发生在尝试访问某个类时,该类在编译时可用但在运行时找不到。解决方法包括:确保所有依赖库已正确添加到类路径中,检查类名和包名是否正确,以及清理并重新构建项目。
            4576 3
            |
            Docker 容器
            docker设置国内镜像源
            docker设置国内镜像源
            48809 5
            |
            NoSQL Redis 数据库
            Redis Windows版下载,带安装包
            文章提供了Windows版Redis的下载和安装指南,包括如何解压、启动Redis服务以及连接到Redis数据库。
            6391 0
            Redis Windows版下载,带安装包

            热门文章

            最新文章