Maven的依赖和传递性质

时间:2024-07-29 17:32:50

1. 引入项目所需jar包

Maven项目直白的一大特点就是一般情况下不需要去自行下载jar包以及目标jar包的依赖包并导入,只需要在去Maven的*仓库http://mvnrepository.com/搜索目标jar,然后选择版本,并将页面上的maven dependency信息放入pom.xml即可,maven会自动下载相应jar包。 当然如果有代理仓库的话,那就在setting.xml里面配置代理仓库信息,这样就会首先去代理仓库里面查找相应jar包。

2. 依赖:体现在pom.xml的dependency节点

一般maven仓库里面的jar所提供的dependency信息都是只有三个节点:groupId,artifactId和version,如下图所示。

Maven的依赖和传递性质

然而大家也能发现创建好maven项目后pom.xml自带的junit的dependency信息可是有4个节点,多出了一个scope节点,而且值为test

Maven的依赖和传递性质

scope有几个值可填: test, compile, import, provided,runtime,system. (默认是compile)其含义如下:

test       : 测试时候会把这个依赖加进来,编译和打包不会。当然,如果某个jar的scope设置为test,那么项目里src/main/java下面就不能有类引用这个jar,只能在src/test/java里面引用这个jar,否则会报错

compile  : 编译和打包的时候都会把这个依赖加进去

provided: 编译和测试的时候会把这个包加进去,但是打包的时候不会加进去。比如web项目的servlet-api.jar

runtime : 在编译的时候不添加这个依赖,测试运行和打包的时候依赖

3。传递

如果引入的某个jar,其pom里面依赖了其它jar包,那么 Maven dependencies(不是pom.xml文件里的dependencies节点)下面会自动添加此jar的其他依赖jar。只会添加scope为complie的jar。

那么问题来了:如果jar包A和B都依赖jar包C,并且A依赖1.0版本的C,B依赖1.1版本的C。这时候如果项目添加了A和B,那么自动引入的C是哪个版本呢?结果是看A和B在pom.xml中的顺序,谁靠前,那么就引入和谁相关的C。也就是A靠前,那么引入1.0版本的C;B靠前,那么引入1.1版本的C。这里面项目和c是属于二级依赖,和A,B是2级依赖。如果项目中也添加1.2版本的C,那么Maven dependencies下面就引入1.2版本的C,因为一级依赖优先于二级依赖

二级依赖也可以排除掉,这就排除了user-log.jar中的commons-logging的依赖。这个一般用在包冲突

Maven的依赖和传递性质

4. compile出错:

如果出现Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project learnMaven01: Compilation failure 以及is jre not jdk字样。那么看看你用的jre是jre还是jdk,改成jdk就ok了。仍旧是在项目的properties的java build path中,选择jre library,然后添加jdk。