10maven依赖继承、统一版本/编码

  A >  B  >  C

  A依赖于B,B依赖于C,如果A想间接依赖C,那么B和C之间的依赖范围必须是compile,不然A依赖不了C

但是有点麻烦,因为每次A想依赖于C都要确认B和C之间的依赖范围是否是compile,否则A依赖不了C,每次确认都会费时间

而且有些依赖的默认范围不是compile,如果修改默认的依赖范围可能导致冲突,比如servlet-api.jar的默认依赖范围是provided,如果修改servlet的默认依赖范围为compile,那么间接依赖serlvet的项目在运行时会报空指针异常,因为项目是在tomcat里面运行的,但是tomcat自带了servlet-api.jar,那就会冲突。

有一种方法,只要B依赖于C,不管依赖范围是否为compile,A都能间接依赖于C,这种方法就是  依赖继承。

 

依赖继承

依赖继承后,A可以使用B的所有依赖

想要实现依赖继承有三个步骤

1、确保被继承的父工程打包方式为pom,并且要在父工程的pom.xml文件中配置依赖

2、在子工程里面配置父工程的坐标,建立继承关系

3、在子工程的pom.xml里面声明要使用到父工程里面的哪些依赖

 

maven打包方式:
java工程——jar
web项目-war
父工程-pom

 

例子:

首先创建父工程,保证打包方式为pom

 

 

 

 

 

 

 然后创建子工程,子工程打包类型没有限制,

然后在子工程pom.xml里面配置依赖

 

 

你一定有点疑问,直接在本项目中配置依赖就可以导入相关Jar包,为什么还要弄继承这么复杂呢,原因有两个

第一:配置依赖每次都要去远程仓库下载jar包,下载jar包即浪费时间又占用空间

第二:继承就可以直接调用原来的jar包,即不用重新下载,又不会新占用空间

 

 

 如果你不确定是否又继承到父工程的依赖可以在下图查看依赖

 

 

统一项目的jdk:
build path:删除旧版本,增加新版本
右键项目-属性-Project Factors -java version 改版本 (之前存在要改的版本)

通过maven统一jdk版本:

  <profiles>
    <profile>  
        <id>jdk-12</id>  
        <activation>  
            <activeByDefault>true</activeByDefault>  
            <jdk>12</jdk>  
        </activation>  
        <properties>  
            <maven.compiler.source>12</maven.compiler.source>  
            <maven.compiler.target>12</maven.compiler.target>  
            <maven.compiler.compilerVersion>12</maven.compiler.compilerVersion>  
        </properties>   
    </profile>  
 </profiles>

通过maven统一编码:

     <properties>  
         <!-- 文件拷贝时的编码 -->  
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
         <!-- 编译时的编码 -->  
         <maven.compiler.encoding>UTF-8</maven.compiler.encoding>  
     </properties> 

不过有时候需要更改依赖的版本号,这需要在pom文件里面找很久,还有就是一个一个的改很麻烦,有种便利的方法:

 还可以结合依赖继承统一版本/编码,更加实用

 

 

 

父工程(pom打包类型)可以充当一个类似本地仓库,即可以利用继承实现空间资源节约,也可以统一版本/编码,还可以聚合项目

不过有个缺点,就是增加了项目之间的耦合度,如果有多个项目同时继承一个父工程,如果在父工程修改版本号,其他子工程也会跟着改变

比如A工程和B工程一开始是使用相同版本的junit的jar包,所以建立了一个父工程同时继承,但是需求发生改变,A工程需要使用3.8的junit,但B工程需要使用4.0的junit,这样只能让其中一个项目不继承,自己另外配置依赖,所以如果保证项目使用的依赖版本不会发生改变,还是建议用父工程的。

 

有什么疑问或建议欢迎在评论区发表。

posted @ 2020-01-16 20:17  HainChen  阅读(423)  评论(0编辑  收藏  举报