「Maven」依赖与依赖管理


pom.xml文件中的依赖声明

所有的依赖写在<dependnecies>框架中,每当声名一个新的依赖时,需要新建一个<dependnecy>,中间至少包含三个内容——groupId artifactId version,可以直接在官网中查找。

<dependencies>
    <!--具体的依赖-->
    <dependency>
      <!--依赖所属群组id-->
      <groupId>junit</groupId>
      <!--依赖所属项目id-->
      <artifactId>junit</artifactId>
      <!--依赖版本号-->
      <version>4.12</version>
    </dependency>
<dependencies>

依赖管理

依赖传递

  • 直接依赖: 在当前项目中通过依赖配置建立的依赖关系(直接在pom.xml中配置的依赖)
  • 间接依赖: 当被依赖的资源如果依赖其他资源,则当前项目间接依赖其他的资源。例如项目A依赖资源B,资源B又依赖资源C,则A间接依赖C……以此类推,类似于继承。

冲突问题的解决

如果一个项目直接和间接依赖的资源中有相同的(版本号不要求相同),则会产生冲突。冲突的解决依赖于以下三个原则——

  • 路径优先:当依赖中出现相同的资源时,层级越深则优先级越低,层级越浅则优先级越高——即遵循就近原则
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。
  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的

可选依赖

可选依赖是指对外隐藏当前所依赖的资源。例如,项目A依赖了资源B,资源B依赖了资源C,但是B对C的依赖时被隐藏的,那么项目A不会间接依赖资源C。

可选依赖的设置方法如下——

<dependencies>
    <!--具体的依赖-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <!--可选依赖选项 -->
      <optional>true</optional>
    </dependency>
<dependencies>

排除依赖

排除依赖是指 主动断开依赖的资源,被排除的资源无需指定版本。例如,项目A依赖了资源B,资源B依赖了资源C,但是我们又不想让项目A间接依赖资源C,那么这时候就需要在项目A中将对资源C的依赖排除。

排除依赖的设置方法如下——

<dependencies>
    <!--具体的依赖-->
    <dependency>

      <groupId>project_C</groupId>
      <artifactId>project_C</artifactId>
      <version>1.0</version>
      <!--排除依赖选项 -->
      <exclusions>
        <exclusion>
          <groupId></groupId>
          <artifactId></artifactId>
        </exclusion>
      </exclusions>

    </dependency>
<dependencies>

依赖范围

依赖的jar在默认情况下可以在任何地方使用,也可以通过scope标签设定其作用范围。

依赖范围分类

  • 主程序范围有效(main文件夹)
  • 测试程序范围有效(test文件夹)
  • 是否参与打包(package指令范围)
scope 主代码 测试代码 打包 资源范例
compile Y Y Y log4j
test N Y N junit
provided Y Y N servlet-api
runtime N N Y jdbc

依赖范围设置

需要使用scope关键字设置依赖的范围——

<dependencies>
    <!--具体的依赖-->
    <dependency>

      <groupId>project_C</groupId>
      <artifactId>project_C</artifactId>
      <version>1.0</version>
      <!--依赖范围选项 -->
      <scope>runtime</scope>

    </dependency>
<dependencies>

依赖范围传递

带有依赖范围的资源进行传递时,作用范围会受到影响,并未严格传递。如下表所示(注:"行"为直接依赖,"列"为间接依赖

compile test provided runtime
compile compile test provided runtime
test - - - -
provided - - - -
runtime runtime test provided runtime

文章作者: Hyggge
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hyggge !
  目录