Maven的依赖-硬依赖,传递依赖,依赖排除(NEW)

来源:互联网 发布:有趣的c语言程序 编辑:程序博客网 时间:2024/04/29 21:19
依赖的查询
http://mvnrepository.com/
http://www.sonatype.org/nexus/
 
 
 硬依赖
指的就是必须由本模块来引入的依赖
传递依赖
当引入其它模块时,由于其它模块中已经有了某些jar包的依赖了,将自动把依赖关系导入到本模块
如,A模块已经配置了对hibernate的依赖,
当B模块中引入A模块的依赖时,hibernate的依赖将自动传入到B模块中。
此时,B模块中不用再配置hibernate的依赖了,会根据传递过来的依赖自动导入那些jar包!
依赖排除
由于有了传递性依赖的特征,当不想导入当前所引入的模块的依赖时,可以使用排除策略,将对应的依赖排除掉。
 
==================================================================
 
 
 
 硬依赖
user-core模块
该模块用于定义实体类,需要的依赖的jar包:hibernate, mysql-connector, log4j, junit 
依赖包的说明:
mysql-connector用来使用Java连接Mysql数据库
hibernate用来持久化对象
junit用来做单元测试
log4j用来做日志
依赖包的坐标通过上面的网址进行查询即可
则POM.xml配置如下:
Xml代码 复制代码 收藏代码
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   
  5.   <groupId>com.gc.user</groupId>  
  6.   <artifactId>user-core</artifactId>  
  7.   <version>0.0.1-SNAPSHOT</version>  
  8.   <packaging>jar</packaging>  
  9.   
  10.   <name>user-core</name>  
  11.   <url>http://maven.apache.org</url>  
  12.   
  13.   <properties>  
  14.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  15.   </properties>  
  16.        
  17.   <dependencies>  
  18.     <dependency>  
  19.       <groupId>junit</groupId>  
  20.       <artifactId>junit</artifactId>  
  21.       <version>4.10</version>  
  22.       <scope>test</scope>  
  23.     </dependency>  
  24.        
  25.     <dependency>  
  26.         <groupId>org.hibernate</groupId>  
  27.         <artifactId>hibernate-core</artifactId>  
  28.         <version>4.2.6.Final</version>  
  29.     </dependency>  
  30.        
  31.    <dependency>  
  32.         <groupId>mysql</groupId>  
  33.         <artifactId>mysql-connector-java</artifactId>  
  34.         <version>5.1.26</version>  
  35.     </dependency>  
  36.        
  37.     <dependency>  
  38.         <groupId>log4j</groupId>  
  39.         <artifactId>log4j</artifactId>  
  40.         <version>1.2.16</version>  
  41.     </dependency>  
  42.                               
  43.   </dependencies>  
  44. </project>  
<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">  <modelVersion>4.0.0</modelVersion>  <groupId>com.gc.user</groupId>  <artifactId>user-core</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>  <name>user-core</name>  <url>http://maven.apache.org</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.10</version>      <scope>test</scope>    </dependency>        <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>4.2.6.Final</version></dependency>   <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.26</version></dependency>        <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency>                             </dependencies></project>
 
 ==================================================================
 
 
 
 传递依赖
user-dao模块
 本模块主要功能是对对象进行持久化操作,当然就离不开hibernate的支持。
由于该模块需要使用到user-core模块中的实体,那么就需要引入user-core模块
那么,user-core模块就需要进行发布(deploy),当发布到私服上,本地就可以下载到该模块的jar包了
注意:
user-core模块中已经依赖了hibernate的jar包,当user-dao模块引入user-core模块时,
user-dao模块就不需要在pom.xml中配置对hibernate的依赖了,因为依赖会传递!
当然,由于user-core模块中对mysql-connector, log4j都有依赖,那么本模块也会自动引入它们!
注意:
依赖传递需要明确的两点:
1.依赖是否传递由scope来决定
2.传递的是依赖关系,而不是将jar包从A模块拷贝到B模块
由于Junit的scope定义为了test,所以该依赖关系不会传递到另一个模块中,
所以,本模块中如果要使用Junit,那么还需要配置对Junit的依赖!
 
本模块中的pom.xml
Xml代码 复制代码 收藏代码
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   
  5.   <groupId>com.gc.user</groupId>  
  6.   <artifactId>user-dao</artifactId>  
  7.   <version>0.0.1-SNAPSHOT</version>  
  8.   <packaging>jar</packaging>  
  9.   
  10.   <name>user-dao</name>  
  11.   <url>http://maven.apache.org</url>  
  12.   
  13.   <properties>  
  14.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  15.   </properties>  
  16.   
  17.   <dependencies>  
  18.     <dependency>  
  19.       <groupId>junit</groupId>  
  20.       <artifactId>junit</artifactId>  
  21.       <version>4.10</version>  
  22.       <scope>test</scope>  
  23.     </dependency>  
  24.        
  25.      <!-- 引入user-core,将会发生传递性依赖:user-core中的依赖是否会导入到本模块中,还要根据scope决定! -->      <dependency>  
  26.         <groupId>com.gc.user</groupId>  
  27.         <artifactId>user-core</artifactId>  
  28.         <version>0.0.1-SNAPSHOT</version>  
  29.     </dependency>  
  30.   </dependencies>  
  31. </project>  
<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">  <modelVersion>4.0.0</modelVersion>  <groupId>com.gc.user</groupId>  <artifactId>user-dao</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>  <name>user-dao</name>  <url>http://maven.apache.org</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.10</version>      <scope>test</scope>    </dependency>         <!-- 引入user-core,将会发生传递性依赖:user-core中的依赖是否会导入到本模块中,还要根据scope决定! -->  <dependency>  <groupId>com.gc.user</groupId>  <artifactId>user-core</artifactId>  <version>0.0.1-SNAPSHOT</version>  </dependency>  </dependencies></project>
 
 
依赖的scope属性
决定该依赖是否传递,是否被打入war包
scope=compile,默认范围,该范围的依赖传递最强,编译,打包,运行都需要;
scope=test,依赖不会传递,生成war包时不会导入;测试包不需要传递,也不需要打入到war包。
scope=provided,依赖不会传递,生成war包时不会导入。仅编译,测试时有用,与test范围有点类似,但是出发点不一样。如servlet-api,容器已经提供了,就不能再包含了,否则,会导致包冲突等异常发生。
scope=runtime,编译时没有依赖,运行时有依赖
scope=system,导入本地jar包,通过指定本地路径来导入
scope=import
 
依赖传递的冲突
本模块依赖其它几个模块,而这几个模块中对某个jar包的依赖版本不同,那么本模块将使用哪个依赖呢?
Maven将自动根据"最短路径原则"来确定!
最短路径原则:
如果本地显示依赖了某个jar包,则用本地的;
如果本地没有显示依赖,而是通过依赖传递依赖的某个jar包:
首先根据最短依赖原则确定;
如果路径长度都相同,则根据依赖书写顺序确定;
依赖的排除 
Maven基于最短路径原则,解决了依赖冲突的问题,我们还可以通过依赖排除来进一步干涉依赖的传递行为。
如,引入user-core时,我不想使用user-core关于log4j的依赖,那么在引入user-core的时候,声明需要排除的依赖即可:
Xml代码 复制代码 收藏代码
  1.  <!-- 引入user-core,将会发生传递性依赖:user-core中的依赖是否会导入到本模块中,还要根据scope决定! -->  
  2. <dependency>  
  3.     <groupId>com.gc.user</groupId>  
  4.     <artifactId>user-core</artifactId>  
  5.     <version>0.0.1-SNAPSHOT</version>  
  6.     <exclusions>  
  7.         <!-- 排除user-core模块中关于log4j的依赖 -->  
  8.         <exclusion>  
  9.             <groupId>log4j</groupId>  
  10.             <artifactId>log4j</artifactId>  
  11.         </exclusion>  
  12.     </exclusions>  
  13. </dependency>  
    <!-- 引入user-core,将会发生传递性依赖:user-core中的依赖是否会导入到本模块中,还要根据scope决定! -->  <dependency>  <groupId>com.gc.user</groupId>  <artifactId>user-core</artifactId>  <version>0.0.1-SNAPSHOT</version>  <exclusions>  <!-- 排除user-core模块中关于log4j的依赖 -->  <exclusion>  <groupId>log4j</groupId>  <artifactId>log4j</artifactId>  </exclusion>  </exclusions>  </dependency>
 
 依赖的显示声明,精确控制依赖的版本
基于Maven的最短路径原则解决了多个相同依赖冲突的问题
依赖排除又提供了一种依赖冲突的解决方案
此外,我们还可以直接在本模块中声明对某个jar包的依赖,优先级最高,冲突也就自动解决了
 
原创粉丝点击