在现在的互联网项目开发当中,特别是Java领域,能够说Maven随处可见。Maven的仓库管理、依赖管理、继承和聚合等特性为项目的构建提供了一整套完善的解决方案,能够说若是你搞不懂Maven,那么一个多模块的项目足以让你头疼,依赖冲突就会让你不知所措,甚至搞不清楚项目是如何运行起来的,专题的目的就是:完全搞定Maven!html
<!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository --> <localRepository>/path/to/local/repo</localRepository>
你要jar包,不可能每次都要联网去下载吧,多费劲,因此本地仓库就是至关于加了一层jar包缓存,先到这里来查。若是这里查不到,那么就去私服上找,若是私服也找不到,那么去中央仓库去找,找到jar后,会把jar的信息同步到私服和本地仓库中。mysql
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.12.6</version> </dependency>
通常而言,咱们能够到私服上输入artifactId进行搜索,或者到http://search.maven.org/、http://mvnrepository.com/上进行查找肯定坐标。sql
在实际开发中,咱们常常遇到这样的场景,好比A服务依赖于B服务,A和B同时开发,B在开发中发现了BUG,修改后,将版本由1.0升级为2.0,那么A必须也跟着在POM.XML中进行版本升级。过了几天后,B又发现了问题,进行修改后升级版本发布,而后通知A进行升级...能够说这是开发过程当中的版本不稳定致使了这样的问题。api
Maven,已经替咱们想好了解决方案,就是使用Snapshot版本,在开发过程当中B发布的版本标志为Snapshot版本,A进行依赖的时候选择Snapshot版本,那么每次B发布的时候,会在私服仓库中,造成带有时间戳的Snapshot版本,而A构建的时候会自动下载B最新时间戳的Snapshot版本!缓存
首先来讲,对于Maven而言,同一个groupId同一个artifactId下,只能使用一个version!根据上图的依赖顺序,将使用1.2版本的jar。tomcat
如今,咱们能够思考下了,好比工程中须要引入A、B,而A依赖1.0版本的C,B依赖2.0版本的C,那么问题来了,C使用的版本将由引入A、B的顺序而定?这显然不靠谱!若是A的依赖写在B的依赖后面,将意味着最后引入的是1.0版本的C,极可能在运行阶段出现类(ClassNotFoundException)、方法(NoSuchMethodError)找不到的错误(由于B使用的是高版本的C)!服务器
使用<dependencyManagement> [这种主要用于子模块的版本一致性中]mybatis
使用<exclusions> [在实际中咱们能够在IDEA中直接利用插件帮助咱们生成]架构
使用<dependency>maven
在工程中,咱们避免不了须要加一些依赖,也许加了依赖后运行时才发现存在依赖冲突在去解决,彷佛有点晚!那么能不能提早发现问题呢?
若是咱们新加入一个依赖的话,那么先经过mvn dependency:tree命令造成依赖树,看看咱们新加入的依赖,是否存在传递依赖,传递依赖中是否和依赖树中的版本存在冲突,若是存在多个版本冲突,利用上文的方式进行解决!
这里须要注意2点:
咱们只须要注意一点:执行后面的命令时,前面的命令自动获得执行。
既然,Maven的生命周期存在编译、测试、运行这些过程,那么显然有些依赖只用于测试,好比junit;有些依赖编译用不到,只有运行的时候才能用到,好比mysql的驱动包在编译期就用不到(编译期用的是JDBC接口),而是在运行时用到的;还有些依赖,编译期要用到,而运行期不须要提供,由于有些容器已经提供了,好比servlet-api在tomcat中已经提供了,咱们只须要的是编译期提供而已。
原文出处:https://www.cnblogs.com/luao/p/10896403.html