深度了解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编辑


            目录
            相关文章
            |
            5天前
            |
            Java 关系型数据库 数据库连接
            |
            9月前
            |
            存储 Java Apache
            2.0 Maven基础
            Apache Maven是一个软件项目管理工具,将项目开发和管理过程抽象程一个项目对象模型(POM,Project Object Model)。
            84 0
            |
            9月前
            |
            Java easyexcel 应用服务中间件
            Maven核心总结
            Maven 部分,不涉及实战,主要是一些重要概念的介绍。
            54 0
            |
            存储 Java 应用服务中间件
            Maven基础
            Maven基础
            97 1
            |
            存储 安全 Java
            |
            存储 IDE Java
            |
            XML Java 应用服务中间件
            maven基础篇(三)
            maven基础篇
            153 1
            |
            JavaScript Java Maven
            |
            Java Maven 开发工具
            maven基础篇(四)
            maven基础篇
            126 1
            |
            存储 JavaScript Java
            Maven 基础
            Maven 基础
            120 0
            Maven 基础