Maven讲解之 依赖管理

阳光穿透心脏的1/2处 2022-06-07 07:17 290阅读 0赞

Maven讲解之 依赖管理

本章节我们将通过两个例子来实例讲解一下Maven的依赖关系。

两个例子

新建两个Maven Project(War)。一客户模块和市场模块作为例子(只举业务逻辑例子,无核心代码)。另外Customer Model 将依赖于Market Model。

  • Market Model

    • 目录结构

      这里写图片描述

    • 操作点

      • install(install 该项目,使Maven 初次下载其生命周期管理的组件)
        右键项目->Run as ->Maven install
      • compile(编译该项目形成Market的SNAPSHOT jar(编译后的class文件))
        右键项目->Run as ->Maven build….. ->goals:compile
    • pom.xml

      1. <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">
      2. <modelVersion>4.0.0</modelVersion>
      3. <groupId>com.sspts.oscar</groupId>
      4. <artifactId>Market</artifactId>
      5. <version>0.0.1-SNAPSHOT</version>
      6. <packaging>war</packaging>
      7. </project>
  • Customer Model

    • 目录结构

      这里写图片描述

    • 操作点

      • 统一管理jar包版本


        UTF-8
        4.0.4.RELEASE
      • 引用其他模块的jar包


        com.sspts.oscar
        Market
        0.0.1-SNAPSHOT
        compiler
      • 去掉对Spring core jar 包中对commons-logging的依赖



        commons-logging
        commons-logging

    • pom.xml

      1. <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">
      2. <modelVersion>4.0.0</modelVersion>
      3. <groupId>com.sspts.oscar</groupId>
      4. <artifactId>Customer</artifactId>
      5. <version>0.0.1-SNAPSHOT</version>
      6. <packaging>war</packaging>
  1. <properties>
  2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3. <spring.version>4.0.4.RELEASE</spring.version>
  4. </properties>
  5. <dependencies>
  6. <!-- spring start -->
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-aop</artifactId>
  10. <version>${spring.version}</version>
  11. <exclusions>
  12. <exclusion>
  13. <groupId>commons-logging</groupId>
  14. <artifactId>commons-logging</artifactId>
  15. </exclusion>
  16. </exclusions>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework</groupId>
  20. <artifactId>spring-aspects</artifactId>
  21. <version>${spring.version}</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-beans</artifactId>
  26. <version>${spring.version}</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework</groupId>
  30. <artifactId>spring-context</artifactId>
  31. <version>${spring.version}</version>
  32. </dependency>
  33. <!-- spring end -->
  34. <dependency>
  35. <groupId>com.sspts.oscar</groupId>
  36. <artifactId>Market</artifactId>
  37. <version>0.0.1-SNAPSHOT</version>
  38. <scope>compiler</scope>
  39. </dependency>
  40. <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
  41. <dependency>
  42. <groupId>javax.servlet</groupId>
  43. <artifactId>javax.servlet-api</artifactId>
  44. <version>3.1.0</version>
  45. <scope>provided</scope>
  46. </dependency>
  47. </dependencies>
  48. </project>

注:本例子只引用了Spring 的部分jar包,请结合实际需求引用spring的jar包。


实例讲解

Maven 中最关键的部分,我们使用 Maven 最主要的就是使用它的依赖管理功能。要理解和掌握 Maven 的依赖管理,我们只需要解决一下几个问题:

  • 依赖的目的是什么
    当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。那么如何在项目中以依赖的方式引入一个我们需要的 jar 包呢?

    答案非常简单,就是使用 dependency 标签指定被依赖 jar 包的坐标就可以了。如本章例子,Customer Model 引用到了Market Model 的SNAPSHOT

    1. <dependency>
    2. <groupId>com.sspts.oscar</groupId>
    3. <artifactId>Market</artifactId>
    4. <version>0.0.1-SNAPSHOT</version>
    5. <scope>compiler</scope>
    6. </dependency>
  • 依赖的范围
    大家注意到上面的依赖信息中除了目标 jar 包的坐标还有一个 scope 设置,这是依赖的范围。依赖的范围有几个可选值,我们用得到的是:compile、test、provided 三个。

    • [1]从项目结构角度理解 compile 和 test 的区别

      这里写图片描述

      从上面的依赖关系可以看出不论是主程序(main下面的JAVA文件)还是测试程序(test下面的JAVA文件)都使用到了compile依赖,而test依赖只用于测试程序。

    • [2]从开发和运行这两个不同阶段理解 compile 和 provided 的区别

      这里写图片描述

      正如我们在Customer Model pom.xml中对 Servlet API的依赖范围定义所示,将Servlet API的依赖范围定义为provided,即在开发阶段我们会依赖Servlt API,一旦项目部署以后,项目将直接忽略Servlet API,二运行阶段酱油Servlet容器提供Servlet API。

    • [3]有效性总结

      这里写图片描述

  • 依赖的传递性
    A 依赖 B,B 依赖 C,A 能否使用 C 呢?那要看 B 依赖 C 的范围是不是 compile,如果是则可用,否则不可用。

    这里写图片描述

  • 依赖的排除
    如果我们在当前工程中引入了一个依赖是 A,而 A 又依赖了 B,那么 Maven 会自动将 A 依赖的 B 引入当前工程,但是个别情况下 B 有可能是一个不稳定版,或对当前工程有不良影响。这时我们可以在引入 A 的时候将 B 排除。

    • 情景举例

      • 不排除依赖时

        这里写图片描述

        1. <dependency>
        2. <groupId>org.springframework</groupId>
        3. <artifactId>spring-aop</artifactId>
        4. <version>${spring.version}</version>
        5. <!-- <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> -->
        6. </dependency>
      • 排除依赖时

        这里写图片描述

        1. <dependency>
        2. <groupId>org.springframework</groupId>
        3. <artifactId>spring-aop</artifactId>
        4. <version>${spring.version}</version>
        5. <exclusions>
        6. <exclusion>
        7. <groupId>commons-logging</groupId>
        8. <artifactId>commons-logging</artifactId>
        9. </exclusion>
        10. </exclusions>
        11. </dependency>
  • 统一管理所依赖 jar 包的版本
    对同一个框架的一组 jar 包最好使用相同的版本。为了方便升级框架,可以将 jar 包的版本信息统一提取出来。例如在Customer Model中我们在pom.xml对spring 以及sourceEncoding做了版本和格式的限制。

    • 统一声明版本号

      1. <properties>
      2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      3. <spring.version>4.0.4.RELEASE</spring.version>
      4. </properties>
    • 引用前面声明的版本号

      1. <dependency>
      2. <groupId>org.springframework</groupId>
      3. <artifactId>spring-aspects</artifactId>
      4. <version>${spring.version}</version>
      5. </dependency>
  • 依赖的原则:解决 jar 包冲突

    • 路径最短者优先

      这里写图片描述

    • 路径相同时先声明者优先

      这里写图片描述

      这里“声明”的先后顺序指的是 dependency 标签配置的先后顺序。

发表评论

表情:
评论列表 (有 0 条评论,290人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Maven依赖管理

    定义maven坐标 每个maven工程都需要定义本工程的坐标,坐标是maven对jar包的身份定义。 <!--项目名称,定义为组织名+项目名,类似包名-->

    相关 maven依赖机制及依赖管理

    maven依赖机制及依赖管理 依赖性传递: 依赖调解: 当项目中出现多个版本构件依赖的情形,依赖调解决定最终应该使用哪个版本。当然,你也可以在项目POM文件中

    相关 Maven 依赖管理

    Maven 依赖管理 Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针...