欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Maven(二)之依赖管理

程序员文章站 2022-07-15 09:48:19
...

Maven(二)之依赖管理

一、依赖的配置

<dependencies>
    <dependency>
           <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <classifier></classifier>
            <scope>provided</scope>
            <type></type>
            <optional></optional>
            <exclusions>
                <exclusion>
                    <artifactId></artifactId>
                    <groupId></groupId>
                </exclusion>
            </exclusions>
    </dependency>
</dependencies>
  1. groupId 公司名称
  2. artifactId 模块名称
  3. version:版本号
  4. classifier:用来定义构建输出的一些附属构建
  5. scope:依赖范围,有以下值
        1)compile,默认值,适用于所有阶段,会随着项目一起发布。
        2)provided,编译和测试的有用,在运行时无效,如servlet-api,在编译和测试的时候需要依赖,但是运行时,容器已经提供,所以不需要再次引入
        3)runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
        4)test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
        5)system,类似provided,需要再使用systemPath元素显示制定依赖文件路径,如下。(由于绑定本地文件,在其他计算机不一定存在,所以尽量不要使用)
  6. type:依赖类型,对应项目坐标定义的packaging,默认不用声明,为jar
  7. optional:标记依赖是否可选,有true和false。如A依赖于B,但是B只是A在测试时使用,这个时候X依赖于A,那么A就不需要B,那么在A的pom中配置optional为true的话,则在x编译的时候会忽略B的依赖。
    true:其他引入A时会忽略依赖B
    false:为默认,会传递依赖B
  8. exclusions:用来排除传递性依赖。比如,我们的项目A中引入了第三方构件B,但是B中又引入了C和D,但是D对于我们的项目有冲突那么我们可以配置如下,将D这个依赖忽略
<exclusion>
    <artifactId>D</artifactId>
    <groupId>D</groupId>
</exclusion>

2.依赖传递性

依赖范围 compile test runtime 例如
compile Y Y Y spring-core
test - Y - JUnit
provided Y Y - servlet-api
runtime - Y Y JDBC驱动实现
system Y Y - 本地的,Maven仓库以外的文件

如果我们在项目中配置一个依赖,但是这个依赖又有很多依赖,这样我们项目中就会存在许多不必要的jar,maven依赖传递性机制可以很好的解决这个问题。
如果A依赖B,我们叫第一直接依赖,B依赖C我们叫第二直接依赖,它们的依赖范围会随传递性产生变化。

由上面可以知道,如果A依赖于B,范围为test,B依赖于C,范围为compile,那么C是A范围为test的传递性依赖

3.依赖调解原则

1、第一声明者优先原则 :maven 自动按照,在 pom 文件定义依赖,先声明的依赖为准。
   如下由于 spring-webmvc 在前边以 spring-webmvc 依赖的 spring-beans-4.2.4 为准,所以最终 spring-beans-4.2.4添加到了工程中。

 <dependency> 
  <groupId>org.springframework</groupId> 
  <artifactId>spring-webmvc</artifactId> 
  <version>4.2.4.RELEASE</version> 
 </dependency> 

   <dependency> 
  <groupId>org.springframework</groupId> 
  <artifactId>spring-context</artifactId> 
  <version>5.0.2.RELEASE</version>  
 </dependency>

Maven(二)之依赖管理

2、路径近者优先原则
   例如:还是上述情况,spring-contex 和 spring-webmvc 都会传递过来 spirng-beans,那如果直接把 spring-beans 的依赖直接写到 pom 文件中,那么项目就不会再使用其他依赖传递来的 spring-beans,因为自己直接在 pom 中定义 spring-beans 要比其他依赖传递过来的路径要近。
   
在本工程中的pom中加入 spirng-beans-5.0.2 的依赖,根据路径近者优先原则,系统将导入 spirng-beans-5.0.2:    

  <dependency> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-beans</artifactId> 
        <version>5.0.2.RELEASE</version> 
   </dependency> 

4.依赖的排除

snapshot–快照版和release–正式版

如果项目A依赖第三方依赖B,B又依赖SNAPSHOT版C那么C的不稳定会影响到A,这个时候就需要排除掉C。还有就是一个传递性依赖在*仓库中对应的版本不存在,我们就需要排除依赖,然后再导入存在版本的依赖

<dependency>
    <groupId>com.ys.b</groupId>
    <artifactId>pro-b</artifactId>
    <version>1.0.1</version>
<!--排除依赖-->
    <exclusions>
        <exclusion>
            <groupId>com.ys.c</groupId>
            <artifactId>pro-c</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 引入正确依赖 -->
<dependency>
    <groupId>com.ys.c</groupId>
    <artifactId>pro-c</artifactId>
    <version>1.0.0</version>
</dependency>

5锁定依赖

面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。

如下的配置是锁定了 spring-beans 和 spring-context 的版本:

dependencyManagement> 
   <dependencies> 
        <!--这里锁定版本为4.2.4 --> 
        <dependency> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-beans</artifactId> 
            <version>5.0.2.RELEASE</version> 
        </dependency> 
        <dependency> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-context</artifactId> 
            <version>5.0.2.RELEASE</version> 
        </dependency> 
   </dependencies> 
  </dependencyManagement> 

6.归并依赖

还可以把版本号提取出来,使用<properties>标签设置成变量。
在使用时,通过el表达式引用版本

<properties> 
   <spring.version>5.0.2.RELEASE</spring.version> 
</properties> 

 <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> 

7、可选依赖

如果A依赖B
B中有如下依赖C
通过配置,optional为true,那么A中就不会依赖这个C

<dependency>
    <groupId>com.my.C</groupId>
    <artifactId>cpt</artifactId>
    <version>1.0.0</version>
    <optional>true</optional>
</dependency>