屏上得来终觉浅,绝知此事要躬行


总结:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 }
span.s1 { font: 12.0px "Helvetica Neue" }
span.s2 { font: 12.0px ".PingFang SC" }

1.maven项目可以简单的通过在pom文件写入依赖的ID+版本号去依赖目标maven项目而且可以直接使用 无需import但被依赖项目每次更新之后都要重新打包!
2.C->B B->A 此时如果C中想依赖A和B 仅需在pom中配置B即可 会自动导入A

3.当在B 中对A的依赖声明为optional    <optional>true</optional> 此时C引用B时,Maven并不会将A作为transitive依赖自动加入
4.C->B->A1 C->A2. 此时C中默认导入离得“近”的项目 此时导入A2
5.B->A1 B->A2 在我的环境中(IDEA2017)默认导入后写的pom 依赖
6.接上C->B 此时显然C中会导入4中的那个依赖 即:后写的依赖
7.B->C->A1 B->D->A2 此时B中会导入先写的pom 依赖中的A 即:先写C 导入A1 先写B导入A2


测试点1:本地Maven项目之间的引用

当前maven项目B 依赖另外两个maven项目A和C A/C项目新建之后B还无法引入依赖,一定要项目install之后 B才能读取依赖 并引入jar包

TestClassA TestClassC 均为上述两个maven项目中的类 可见现在已经可以直接使用这两个类


测试点2:B->A         "->"表示依赖于   C->B 那么C中是否可以直接引用A  而无需在pom文件中引入A

当在B 中对A的依赖声明为optional    <optional>true</optional> 此时C引用B时,Maven并不会将A作为transitive依赖自动加入

B->A

C->B

可见此时A的jar包已经自动导入进当前依赖中了 而pom中仅仅描述了对B的依赖  显然项目可以直接使用A 如下图

测试点2成立


测试点3:B->A1      C->B 且C->A2    A2表示A1的升级版本 此时C调用A中类如何取舍

可以看到此时自动将之前的testClassA:1.0-SNAPSHOT 替换掉了

显然此时不会冲突自动使用用新的TestClassA


测试点4 :B->A1 & B->A2   C->B    此时项目C的External Libraries会怎么样? 此时再去使用TestClassA 怎么办?

可以看到此时虽然B依赖了两个版本的A  但是项目只选取了2.0

见证奇迹的时刻,调换两个依赖在pom中的位置,此时依赖变成了1.0  =  =、还以为是默认选取高版本   看来是后来者居上

看看此时C里的情况

case1:   C 依赖B  显然会引来后来居上的那个版本 不过项目B需要重新install一发 C才能反映过来B中的变化

case2:c 依赖b 并且依赖a2  该case排除了后来居上的因素 项目C此时依赖的是2.0 可见此时项目会选取更加“近”的版本!


测试点5 B->C->A1    B->D->A2   此时如何处理A?还是按照后来居上?

=======遇到了玄学问题    马丹  C->B->A  C中自动导入A     反过来B->C->A  B中只有C没有A   ?????? ===================

====神tm囧  还大呼小叫的 让室友来帮忙看这个玄学问题  结果是因为C里面的代码有报错  maven编译的时候 根本不能打成jar包  B找到的还是本地库中的老包  所以不显示A  这你妹 以后遇到玄学问题  不要过于自信 多去找找自己代码的原因  稳住! maven编译的那个错误也是不太明显,======

好了 我们继续测试  可以看到此时项目B默认导入的是上面的那个项目的依赖A  即A2

在上面的依赖中添加<exclusion>  此时项目C导入的依赖为A1


测试点6:在项目中调用依赖项目的函数

此时项目B依赖C和D  在方法中调用了C和D的两个方法 分别使用了CD各自依赖的A中的方法 此时项目导入的A为1版本

C中方法的A为2版本  此时运行程序会报错  显然此时无法找到A2中的方法

=========== 修仙去了,明天再做总结======================

Maven实战1的更多相关文章

  1. Maven实战:Maven生命周期

    前言 之前有写过一篇文章Maven实战,介绍了Maven的一些基本概念,以及对于一个初学者而言的Maven基础知识,当时在我看来掌握了这些基本是够用的. 随着工作的深入,越来越感觉对于Maven的理解 ...

  2. maven实战(01)_搭建开发环境

    一 下载maven 在maven官网上可下载maven:http://maven.apache.org/download.cgi 下载好后,解压.我的解压到了:D:\maven\apache-mave ...

  3. Maven实战(六)依赖

    我们项目中用到的jar包可以通过依赖的方式引入,构建项目的时候从Maven仓库下载即可. 1. 依赖配置    依赖可以声明如下: <project> ... <dependenci ...

  4. 学习笔记——Maven实战(四)基于Maven的持续集成实践

    Martin的<持续集成> 相信很多读者和我一样,最早接触到持续集成的概念是来自Martin的著名文章<持续集成>,该文最早发布于2000年9月,之后在2006年进行了一次修订 ...

  5. 学习笔记——Maven实战(六)Gradle,构建工具的未来?

    Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你就会发现曾经大红大紫的技术已经成为了昨日黄花,当然,Maven也不会例外.虽然目前它基本上是Java构建的事实标准,但我们 ...

  6. 学习笔记——Maven实战(七)常用Maven插件介绍(上)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的.进一步说,每个任务对应了 ...

  7. 学习笔记——Maven实战(八)常用Maven插件介绍(下)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  8. Maven实战之Quick Start

    Introduction Maven是一个异常强大的构建工具,能够帮我们自动化构建过程,从清理.编译.测试到生成报告,再到打包和部署.通过Maven,我们只需要输入简单的命令(如mvn clean i ...

  9. 【转】Maven实战(九)---模块聚合和继承

    原博文出自于:http://blog.csdn.net/liutengteng130/article/details/47001831   感谢! 类之间有聚合和继承关系,Maven也具备这样的设计原 ...

  10. 学习笔记-[Maven实战]-第三章:Maven使用入门(1)

    说明:[Maven实战]一书还介绍了怎么样手工创建Maven工程,学习这本书是为了能尽快在工作中使用,就忽略了手工建工程的部分 如果想了解这部分的内容,可以自己看看书 开始: 1.新建一个maven工 ...

随机推荐

  1. 2_http协议详解

    当客户端与服务器进行交互时,就存在web请求,这种请求都基于统一的应用层协议(http协议)交互数据.它允许将HTML文档从web服务器传送到web浏览器. http协议是无状态的协议.无状态是指we ...

  2. UEditor编辑器第一次赋值失败的解决方法

    网上查了很多方式都不是很好用,最后想到了这样的处理方式 首先在js中定义一个全局变量 var ue = null; 然后在初始化显示编辑器的时候js这样写 if (ue == null) { ue = ...

  3. 点击grid单元格弹出新窗口

    实现功能:点击指定单元格后会弹出新窗口,并且最后一行合计不会触发单元格触发函数 <script type="text/javascript"> grid.on('cel ...

  4. Kosaraju算法详解

    Kosaraju算法是干什么的? Kosaraju算法可以计算出一个有向图的强连通分量 什么是强连通分量? 在一个有向图中如果两个结点(结点v与结点w)在同一个环中(等价于v可通过有向路径到达w,w也 ...

  5. HTML中document.getElementById()方法的操作

    转自:http://blog.csdn.net/pyffcwj/article/details/7240232/ obj = document.getElementById("cc" ...

  6. kindeditor上传图片时候,上传成功了,但是页面上却提示失败

    今天尝试着kindeditor做一个上传demo,碰到了一个日狗的问题,百度谷歌都没有答案,最后查看源码才发现问题所在,记录一下,福利大众. 碰到问题如下,图片后台明明上传成功了,返回信息也是正确的, ...

  7. Linq 实现sql中的not in和in条件查询

    T-SQL的IN: Select ProductID, ProductName, CategoryID From dbo.Products Where CategoryID in (1, 2) T-S ...

  8. 【★】RSA-什么是不对称加密算法?

    不对称加密算法RSA浅析 本文主要介绍不对称加密算法中最精炼的RSA算法.我们先说结论,也就是RSA算法怎么算,然后再讲为什么. 随便选取两个不同的大素数p和q,N=p*q,r=(p-1)*(q-1) ...

  9. MPLS VPN随堂笔记1

    MPLS VPN 基础 1.MPLS vpn架构的特点 1.1.允许不同CE传递相同私网路由 1.2.SP内部(所有P路由器)不需要学习CE路由 1.3.无安全保障但有带宽保障(跟SP租用服务) 2. ...

  10. Java 多线程(二) 线程的实现

    线程的实现 在Java中通过run方法为线程指明要完成的任务,有两种技术来为线程提供run方法: 1.继承Thread类并重写它的run方法.之后创建这个子类的对象并调用start()方法. 2.通过 ...