maven学习笔记(二) 依赖

原创 2013年12月06日 11:15:22

maven版本:apache-maven-3.1.1  
IDE: springsource   默认支持maven集成
            若使用的是eclipse,则需要先安装m2eclipse来支持maven的集成

     注意:

     修改IDE集成的maven版本,使用自己新安装的maven  (Window->Preferences->Maven->Installations)
      若修改了默认本地仓库路径,还需要在 Window->Preferences->Maven->User Settings 中配置路径指向修改后的本地仓库下的settings.xml文件,
      本地路径为 D:\dev_env\maven\settings.xml

依赖包的查询
1、所有的依赖都是通过坐标来进行存储的(GAV-->groupId、artifactId、version),也是通过坐标来查找的
2、有一些网上的仓库提供了坐标的查询(http://mvnrepository.com),输入需要查找的jar包(如:spring,struts)

依赖传递

若项目A依赖了C jar包,B项目依赖了A项目,则B项目依赖了C jar包,这就是依赖的传递(这种依赖是基于compile范围进行传递的)

下面以一个实例来说明依赖传递的冲突和maven解决冲突的机制:

 若存在A、B、C、D四个项目,他们之间互相依赖,A依赖B和C,B依赖D

 同等长度的依赖路径-->根据依赖定义顺序处理冲突             

若B和C中都依赖了POI的jar包,B依赖poi-3.9 ,C依赖 poi-3.10,那么根据传递性A也会依赖poi,此时根据B和C在A的pom文件(A依赖B、C,会在dependencies中定义)中依赖的顺序决定poi的版本,若B在前面则A依赖poi-3.9;否则依赖poi-3.10

不同等长度的依赖路径-->根据依赖路径长度取路径短的依赖       

若C和D中都依赖了POI的jar包,C依赖poi-3.9 ,D依赖 poi-3.10,那么根据传递性A也会依赖poi,由于A到C的路径较短,所以A会依赖poi-3.9

可在依赖中排除某些依赖关系(控制依赖、也可以解决依赖冲突)

若B和C中都依赖了log4j的jar包,B依赖log4j-1.2.16 ,C依赖 log4j-1.2.17,那么根据传递性A也会依赖log4j,可在A项目的pom文件中排除B项目的log4j依赖,此时A就会依赖C的log4j-1.2.17

A项目pom文件依赖定义如下:

<dependency>
			<groupId>B</groupId>
			<artifactId>B</artifactId>
			<version>SNAPSHOT-0.0.1</version>
			<type>jar</type>
			<scope>compile</scope>
			<exclusions>
	    		<exclusion>
	    			<groupId>log4j</groupId>
	    			<artifactId>log4j</artifactId>
					<version>1.2.16</version>
	    		</exclusion>
	    	</exclusions>
		</dependency>
		<dependency>
			<groupId>C</groupId>
			<artifactId>C</artifactId>
			<version>SNAPSHOT-0.0.1</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>

依赖范围

1、test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖
2、compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去
3、provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突
4、runtime在运行的时候依赖,在编译的时候不依赖

默认的依赖范围是compile

依赖范围对传递性依赖的影响

假设现在有一个项目A依赖项目B,项目B依赖log4j,则称A对B的依赖为第一直接依赖,B对log4j的依赖为第二直接依赖

下图中左边一列表示第一直接依赖的范围,上面的一行表示第二直接依赖的范围。

假设:A对B的依赖范围为compile(<scope>compile</scope>),B对log4j的依赖范围为compile,

           那么根据下图可查到传递性依赖的范围为compile,表示A对log4j的依赖也是compile

根据上面图例可总结:

       当第二直接依赖的范围为compile时,传递性依赖的范围与第一直接依赖的范围一致;

       当第二直接依赖的范围为test时,依赖不会传递;

       当第二直接依赖的范围为provided时,只有当第一直接依赖的范围也为provided时,依赖才会传递且传递依赖的范围也是provided;

       当第二直接依赖的范围为runtime时,传递性依赖的范围与第一直接依赖范围一致(但第一直接依赖范围为compile时比较特殊,此时传递性依赖范围为runtime)。

聚合和继承

聚合:分模块开发的各个子项目要分别编译、测试、打包会很麻烦,可以建立一个单独的项目parent,这个项目中只有一个pom文件,将分开的子项目作为模块(在pom文件中使用module配置)配置到parent项目中,运行parent中的pom文件,就能自动同时一并构建各个模块。

继承:分模块开发的各个子项目的pom文件中会有很大一部分的配置元素是重复的(如:作为一个大项目的各个模块,groupId应该是相同的;依赖的重复配置),可以建立一个单独的项目parent,这个项目的pom文件会抽取那些公有的重复配置供各个子模块继承(子项目的pom文件中使用parent配置需要继承的pom项目信息)。

继承的配置主要是:

1、在子项目的pom文件中使用parent元素对父pom进行定义

2、在父pom文件中会定义一些公共的元素供子pom继承,父pom中定义依赖是要在dependencies节点上添加一个父级节点dependencyManagement

聚合和继承的父pom文件中的packaging属性的值必须是pom

下面引用上一篇文章中提到的视频中的实例:

user-parent作为聚合项目、被继承的父项目,这个项目中只有一个pom文件;其余的都是子项目

user-parent的pom文件

<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>org.konghao.user</groupId>
  <artifactId>user-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <modules>
  	<module>../user-core</module>
  	<module>../user-dao</module>
  	<module>../user-log</module>
  	<module>../user-service</module>
  </modules>
  <url>http://maven.apache.org</url>
  <!-- <repositories>
  	<repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://nexus.sourcesense.com/nexus/content/repositories/public/</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories> -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>4.10</junit.version>
  </properties>
  <dependencyManagement>
  	<dependencies>
	  	<dependency>
	  		<groupId>junit</groupId>
	  		<artifactId>junit</artifactId>
	  		<version>${junit.version}</version>
	  		<scope>test</scope>
	  	</dependency>
	    <dependency>
	    	<groupId>org.konghao.user</groupId>
	    	<artifactId>user-core</artifactId>
	    	<version>0.0.1-SNAPSHOT</version>
	    </dependency>
	    <dependency>
	    	<groupId>org.konghao.user</groupId>
	    	<artifactId>user-dao</artifactId>
	    	<version>0.0.1-SNAPSHOT</version>
	    	<type>jar</type>
	    	<scope>compile</scope>
	    </dependency>
	    <dependency>
	    	<groupId>org.konghao.user</groupId>
	    	<artifactId>user-log</artifactId>
	    	<version>0.0.1-SNAPSHOT</version>
	    	<type>jar</type>
	    	<scope>compile</scope>
	    	<exclusions>
	    		<exclusion>
	    			<groupId>log4j</groupId>
	    			<artifactId>log4j</artifactId>
	    		</exclusion>
	    	</exclusions>
    	</dependency>
	     <dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>3.6.10.Final</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.16</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.18</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.6.4</version>
		</dependency>
		<dependency>
			<groupId>javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.12.1.GA</version>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.1.1</version>
		</dependency>
  	</dependencies>
  </dependencyManagement>
</project>


user-core的pom文件

<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>
  <parent>
  	<groupId>org.konghao.user</groupId>
  	<artifactId>user-parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<relativePath>../user-parent/pom.xml</relativePath>
  </parent>
  <artifactId>user-core</artifactId>
  <name>user-core</name>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
   <dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-core</artifactId>
	</dependency>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
	</dependency>
	<dependency>
		<groupId>javassist</groupId>
		<artifactId>javassist</artifactId>
	</dependency>
  </dependencies>
</project>


其余子项目的pom文件类似与user-core

依赖分析

可在项目的根路径下运行maven命令,分析当前项目的依赖情况

mvn dependency:list  显示已解析依赖

mvn dependency:tree   依赖树

mvn dependency:analyze  依赖分析      需要关注Used undeclared dependencies found(项目中使用到的,但没有直接声明的,传递性依赖过来的),需要显示声明这些依赖

                    

版权声明:本文为博主原创文章,未经博主允许不得转载。

slf4j 和 log4j合用的(Maven)配置

简述: 添加logger的日志输出,下面是配置信息供备忘 步骤: 1. 在Maven的porn.xml 文件中添加dependency如下 org.slf4j slf4j-l...
  • anialy
  • anialy
  • 2013年01月22日 11:53
  • 92945

解决slf4j 冲突

可能出现的异常:发现配置的logback.xml文件没有起作用,于是分析了一下启动log,发现log中出现了SLF4J冲突异常: SLF4J: Class path contains multiple...
  • suifeng3051
  • suifeng3051
  • 2016年06月24日 10:09
  • 6984

JavaWeb日志管理---@Slf4j注解

@Slf4j注解的正确使用1、对于一个maven项目。首先要在pom.xml中加入以下依赖项: org.slf4j slf4j-api ...
  • wangjie123end
  • wangjie123end
  • 2017年08月16日 11:38
  • 3280

日志组件slf4j介绍及配置详解

基本介绍每一个Java程序员都知道日志对于任何一个Java应用程序,尤其是服务端程序是至关重要的,而很多程序员也已经熟悉各种不同的日志库如java.util.logging、Apache log4j、...
  • u011331383
  • u011331383
  • 2016年05月12日 17:24
  • 47436

Maven学习笔记(三) :Maven使用入门

编写POM:      Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。     ...
  • Troy__
  • Troy__
  • 2014年08月26日 18:43
  • 3155

机器视觉学习笔记(一)

来秦皇岛快一周了,跟导师、学长聊了聊,觉得自己还是想做机器视觉,毕竟做一个智能机器人或者做智能家居一直是我的兴趣所在。这两天学了opencv,进度很慢,有待提高效率。在csdn上发现了很多有用的资料,...
  • sunlightli1216
  • sunlightli1216
  • 2015年01月16日 11:19
  • 258

slf4j 使用介绍

每一个Java程序员都知道日志对于任何一个Java应用程序,尤其是服务端程序是至关重要的,而很多程序员也已经熟悉各种不同的日志库如java.util.logging、Apache log4j、logb...
  • qq_26344609
  • qq_26344609
  • 2017年08月07日 18:35
  • 129

maven 使用slf4j

ch.qos.logback             logback-core             0.9.29                             ch...
  • h70614959
  • h70614959
  • 2014年04月25日 16:21
  • 9552

maven工程检查依赖包冲突的命令

maven工程检查依赖包冲突的命令: mvn -X compile dependency:tree -Dverbose >a.log   执行此命令可以检查Jar包版本冲突:mvn -X c...
  • nanfeng224
  • nanfeng224
  • 2015年05月12日 15:37
  • 2221

maven依赖(二)

排除依赖 背景:我在service中有一个jar包,然后在api中也有一个相同的jar包,因为service依赖于api;这样就会有冲突,因为有两个相同的jar包了。这时候就需要用到依赖传递 ...
  • kwy15732621629
  • kwy15732621629
  • 2017年08月02日 11:26
  • 224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:maven学习笔记(二) 依赖
举报原因:
原因补充:

(最多只允许输入30个字)