<dependencies>依赖的范围、传递、冲突
1 <dependency> 2 <groupId>com.alibaba</groupId> 3 <artifactId>druid</artifactId> 4 <version>1.1.4</version> 5 <scope>test</scope> 6 <optional></optional> 7 8 <exclusions> 9 <exclusion> 10 <groupId>com.alibaba</groupId> 11 <artifactId>jconsole</artifactId> 注意这里没有写版本 12 </exclusion> 13 <exclusion> 14 <groupId>com.alibaba</groupId> 15 <artifactId>tools</artifactId> 16 </exclusion> 17 </exclusions> 18 </dependency> 依赖范围<scope>是指定依赖范围。有六个值: Compile是默认的范围。编译测试运行都有效。 Provided 编译、测试有效。 Runtime 测试、运行时有效。 Test? 只测试有效 System 编译、测试有效。 Import? 只用在dependencyManagement中,表示从其他pom中导入depency的配置?意思是复制其他地方的配置?
开发中用到某个框架,要将框架的jar包引入到classpath中。 Maven有三个classpath: ????? ? 编译、测试、运行 依赖的范围就是控制依赖和三个classpath的关系(在哪个阶段) 依赖传递A依赖B,B依赖C,则A 默认是传递依赖C(我跟你混,你跟他混,那我默认也是跟他混)。A不想依赖C,则需要排除依赖。在<exclusions></exclusion>中配置;或者在<optional></optional>中配置。 项目的这个位置可以查看本项目的依赖: 如果项目A的pom里设置依赖B,项目B的pom里设置依赖C,项目A编译后,可以在此位置看到B和C(B和C是自己写的项目的话,首先要打包进本地仓库)。 ? ps: 如果依赖的是仓库里的jar,那首先去本地仓库里找,找不到就去中央仓库找,再找不到就报错。 如果依赖的是自己的另一个项目,首先需要把自己的项目打包进本地仓库才行(项目运行Goals那里依次执行package命令和install命令)。要不是找不到的。 <exclusions>可以在A的pom里的对B的依赖部分添加<exclusions></exclusion>: 1 <dependency> 2 3 B的坐标 4 5 <exclusions> 6 7 这里面写C的坐标。 ? ? 这样,A在依赖B的同时,不继承B对C的依赖。 <optional>可以在B对C的依赖部分添加<optional> <dependency> C的坐标 <optional>true </optional> </dependency> 这样的意思是,C只被B依赖,如果A依赖B,并不会被传递依赖C。<optional></optional>的默认值是FALSE,默认是继承依赖 当然,如果A也想要依赖C,在自己的pom里声明对C的依赖就可以了。 ? 依赖冲突:是指有多条依赖传递到同一个jar,就需要确定到底是走哪一条依赖传递。有两个原则:短路径优先;先声明优先 比如: A->B->C->X A->D-X 此时默认是选路径最短的那一条。
如果路径一样长的时候,就选最先声明的。在<dependency>里,谁写在前面,就选谁。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |