这里写自定义目录标题
- 一 maven中依赖的传递
- 1 依赖的传递性
- 2 使用complie范围依赖spring-core
- 3 测试依赖是否被传递
- 4 依赖传递性的意义
- 二 maven中依赖的排除
- 1 依赖排除概述
- 2 具体操作依赖排除
- 三 maven中依赖的继承
- 四 maven中依赖的聚合
一 maven中依赖的传递
1 依赖的传递性
A依赖B,B依赖C,在A没有配置对C依赖的时候,A能不能直接使用C(C是否能传递到A)取决于B依赖C时的依赖范围
B依赖C时,是compile范围,可以传递
B依赖C时,使用test或者provided范围,不能传递,所以需要明确配置依赖
2 使用complie范围依赖spring-core
测试方式:让 pro01-maven-java 工程依赖 spring-core
具体实现步骤:编辑pro01-maven-java 工程根目录下 pom.xml
加入一个代码块
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
mvn dependency:tree
ccess to local repository, switch to '${repositorySystemSession}' expression and get LRM from it instead.
[INFO] com.xyt.maven:pro01-maven-java:jar:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.12:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
spring-core对commons-loging的依赖是compile范围的
mvn dependency:list
D:\maven_workspace\spaceVideo\pro01-maven-java>mvn dependency:list
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro01-maven-java >-------------------
[INFO] Building pro01-maven-java 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- dependency:2.8:list (default-cli) @ pro01-maven-java ---
[WARNING] Parameter 'local' is deprecated core expression; Avoid use of ArtifactRepository type. If you need access to local repository, switch to '${repositorySystemSession}' expression and get LRM from it instead.
[INFO]
[INFO] The following files have been resolved:
[INFO] org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] commons-logging:commons-logging:jar:1.1.1:compile
[INFO] org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] junit:junit:jar:4.12:test
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
显示出来的都是当前工程,可以使用的依赖
3 测试依赖是否被传递
D:\maven_workspace\spaceVideo>cd pro02-maven-web
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro02-maven-web >--------------------
[INFO] Building pro02-maven-web Maven Webapp 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- dependency:2.8:tree (default-cli) @ pro02-maven-web ---
[WARNING] Parameter 'localRepository' is deprecated core expression; Avoid use of ArtifactRepository type. If you need access to local repository, switch to '${repositorySystemSession}' expression and get LRM from it instead.
[INFO] com.xyt.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.11:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.xyt.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
由图中可知,web包中含有java包里面的依赖
jar包怎么跑到war包里了,归根结底是因为坐标的问题,指定工程依赖的坐标
看那个web工程目录下,有个jar包
<!-- 配置对Java工程pro01-maven-java的依赖 -->
<!-- 具体的配置方式:在dependency标签内使用坐标实现依赖 -->
<dependency>
<!--
通过指定被依赖工程的坐标完成依赖
-->
<groupId>com.xyt.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
回去重新安装一下
D:\maven_workspace\spaceVideo\pro01-maven-java>mvn clean install
安装成功,回到2号工程查看相应信息
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< com.xyt.maven:pro02-maven-web >--------------------
[INFO] Building pro02-maven-web Maven Webapp 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- dependency:2.8:tree (default-cli) @ pro02-maven-web ---
[WARNING] Parameter 'localRepository' is deprecated core expression; Avoid use of ArtifactRepository type. If you need access to local repository, switch to '${repositorySystemSession}' expression and get LRM from it instead.
[INFO] com.xyt.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.11:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.xyt.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
相当于是ABCD的依赖传递
但是junit范围是test就不能传递
servelet-api传递的provided范围依赖不能传
4 依赖传递性的意义
可以实现三拖106的jar包导入效果
springboot和springcloud本质就是一堆jar包
二 maven中依赖的排除
1 依赖排除概述
- 如果说错误的定义了依赖的范围,导致从本地打的war包含有的依赖,与运行环境中的依赖产生了冲突,这是就需要排除依赖
- A依赖B,B依赖C,假设这些依赖的范围都是compile,可以相互传递 ,但是A不想要C,那么就需要在A里面把C排除掉,好比让葫芦娃救爷爷,一般来说,葫芦娃只救自己的爹
- 配置依赖排除的目的就是避免冲突
2 具体操作依赖排除
找到默认的安装仓库
配置groupid与artifactedId的值进去
运行这个语句:
D:\maven_workspace\spaceVideo\pro02-maven-web>mvn dependency:tree
[INFO] com.xyt.maven:pro02-maven-web:war:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.11:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] \- com.xyt.maven:pro01-maven-java:jar:1.0-SNAPSHOT:compile
[INFO] \- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
和配置前的形成了一个对比
在这个dependency里面完成一些配置
<dependency>
<!--
通过指定被依赖工程的坐标完成依赖
-->
<groupId>com.xyt.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<!--
配置依赖的排除
-->
<!-- 使用excludes标签配置依赖的排除 -->
<exclusions>
<!-- 在exclude标签中配置一个具体的排除
让commons-logging不要传递到当前工程
-->
<exclusion>
<!--在maven的世界里,找jar包的唯一方式就是坐标-->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
三 maven中依赖的继承
maven工程中,A工程继承了B工程,就是说A工程的POM继承了B工程的POM,被继承的B就叫做父工程,而另一个显然就叫做子工程
四 maven中依赖的聚合
聚合的目的就是整合资源,一个总工程,带着许多模块子工程,有了父工程,就不用分别启动子工程了,直接一键执行maven命令,体现了约定大于配置,配置大于编码的思想
- 传统无聚合:一般来说,先启动父工程,后启动子工程;
有依赖的工程,先安装被依赖的工程,比方说,一个java项目,被一个web项目依赖,我们需要设计各种逻辑图,严谨的