Maven解决冲突的小技巧(适用于Maven入门的新人)

Maven的冲突的小一些小问题

pom.xml

最近把项目架构,转变成了Maven,代替原来的JavaWeb项目。随着pom.xml的插入,用起来那叫一个爽。平时我们的jar都是网上的资料那边老师提供的。

image-20201028222151675

但是Maven的pom文件也不是那见得那么简单,我们平时其实粘贴jar包,老师给的包一般不会出问题,而且同一种jar包的不同版本同时放lib目录下好像没出现啥问题。

Maven这种本地仓库的方式好处是不用说的,减少项目文件大小,通过中央仓库,可以让不同的设备都能同步jar包。但是我们使用起来,要一步一步的加<dependence>,貌似没有简化我们的开发。

image-20201028222546075

如图,将原来的JavaWeb项目转换为Maven格式,写了200行的xml,为了方式重复加了,还添加一些注释,有一些jar包之间存在依赖,比如SpringMVC如果做Ajax可能要导入jackson之类的,Spring如果不是用SpringMVC来启动加载时,要导入Spring-Context-Supports,还有各种问题。

这些问题跑到我们这些小菜鸟面前就是,咦怎么报错了?我明明没改代码呀,我之前不是好好的吗?于是乎,把报错的代码CV到百度,点击第一条,恍然大悟!然后其实并不是这问题,结果一翻就是N多条。

我之前把一个java.util.Date cannot cast to java.sql.Date作为标题,来记录我遇到的一个问题,你猜怎么着,这几乎是我访问量TOP3的博客了,而且我文章内容就几百个字,可见来百度的大部分不是来学习知识的,而是来解决报错问题的。

所以使用Maven的时候一定要注意几点:

  1. Maven版本不要冲突!这个可以去官网的Maven Tree去查,当然也可以用一些插件比如Maven Helper查询。
  2. 注意一些jar的依赖关系,比如MySQL这种基本上就一个jar,而Spring的组件,一般你先把context,beans,core,aop这几个先加上,比如你导入spring-tx的时候,aop就需要导入,你导入spring-web和spirng-webmvc的时候,spring-context,beans,core都是必要的。

优化方案

properties标签

这个标签可以理解为你自己定义了一些常量。

image-20201028223749637

然后你可以向el表达式一样去填充dependence,然后我们修改版本只需要去properties改就行了,出问题也只要改properties的内容即可。

image-20201028223809210

spring-boot-starter

别紧张,我们的确还是JavaWeb转Maven阶段的小菜鸟,JavaWeb主要是告诉我们什么是构建。Maven如果一开始就交,那么我们的世界中可能就是:咦?这个项目怎么没有pom.xml文件,是不是哪里错了,我手动一下。不经历一下最原始的方案,我们不会知道一个新技术为什么要去学习。如果我们好高骛远,先学习了springboot,网上看了几篇博客,主页跑起来了,然后index.html加进去,有页面内容了。按照这种方式去学习,那么你是不是连tomcat是什么都不知道,别说serlvet了!(SpringBoot自带tomcat,无需部署到tomcat,可以无容器依赖字节直接网页)。

扯的有点远,这里讲的是Maven的pom.xml文件的优化问题。虽然我们还没学习到springboot,甚至可能spring还没起步,但是我们可以这么理解:框架是简化我们开发的,一般我们觉得又累又苦的事情总会有人帮我们做,只有这样才能推进行业发展(帮助懒人上路)。

spring-boot-starter可以理解为一堆依赖的结合体,虽然starter会写一些自动配置类,但是我们只要不去开启这些自动配置,可以理解为我们只是导入了几个jar包而已。如图:我们点开来spring-boot-starter-web中就看到实际上它是导入了spring-web和spring-webmvc了,其中的spring-boot-starter中再点开可以看到Spring的核心jar。也就是说一个starter就把web相关的jar都整进来了!

image-20201028235054600

之前200多行,现在我一行就能把jar包都导入完,看不懂没关系,我一个一个讲。

image-20201028231913220

parent标签

这个是版本仲裁,简单的说就是把不会冲突的jar包的版本做一个事先声明,只要我们导入parent标签,只要是被我们parent标签标记的jar包,可以不写版本号,也就是version,为什么呢?crtl+鼠标左键点开。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ne2kv62H-1603900397224)(C:\Users\Faker\Desktop\关于Maven依赖的问题.assets\image-20201028232002513.png)]

我们又发现了parent,爸爸的爸爸叫什么?

image-20201028232036685

点击去发现,我们常用的jar包都得定了一个版本,密密麻麻好几千行,也就是说那些比较著名的jar包,我们常用的mysql驱动包,spring,什么的肯定都有啊!

image-20201028232115828

然后看一下starter,starter现在不要求知道自动配置原理,我们大概懂一些简单的理论即可。

image-20201028232407948

starter是场景启动器的意思,spring-boot-starter-xxxxx表示spring公司写的常见启动器,而xxxx-spring-boot-starter是别的公司写的去适配spring,这些先不管他们。首先我们是不是需要玩web项目?是的吧,那么spring知不知道用户会玩web项目,不知道啊!那么我们把spring-boot-starter-web导进来。这时候spring知道用户在玩web项目,那么用户会怎么玩?用servlet吗,filter吗,会用jsp吗?会用json传递数据吗?会用BeanUtil吗?spring表示,只要你在玩web,那我就把玩具都给你,好好玩尽情的完!我们导入web的starter就是导入了web这个情景,那么用户这这个情景下会做的大部分事情我们都帮你准备好。

那么假如我们要玩mybatis,mybatis是有名的框架吗?是啊,那么spring知不知道他,知道啊spring知道这个框架也做了starter。好!那我们要玩mybatis,导入starter,咦没有啊,怎么办?换着把mybatis写前面,mybatis-spring-boot-starter,有了!导入了mybatis的情景,那么我们就可以玩了,mybatis用户会和spring一起玩吗吗?会啊!所以mybatis的各种玩法,starter都给你启动好了,直接可以整合spring。

其他的也不难像,比如你spring想玩spring集成的测试,搜索spring-boot-starter-test,玩什么搜什么,基本上命名都是那样的,spring-jdbc。。。

自创的导包方法

现在我们知道了spring-boot-starter确实有效的简化了Maven导包的痛苦过程,但是还是会有一些包的疏漏。这时候我们应该面向报错编程。如图,我先按照理论来添加三个starter,合情合理。spring肯定知道阿里巴巴这个公司,但是不可能连你们短信的服务都知道吧,parent也就3000多行代码,互联网公司那么多,一个公司还不够分0.0.1行啊,所以阿里的短信服务这里肯定另外添加,合情合理。

image-20201028233530065

先clean,再compile。

image-20201028233825206

报错了,这个没得玩,所以自己添加一下。

image-20201028233913967

tomcat启动报错,少东西了。

image-20201028234127894

这里两个单独添加上

image-20201028234155357

页面升起来了!

image-20201028234244895

用了我这套面向报错编程,很快问题就解决了。注意几点:

  • 一般而言,spring-boot-parent主要把一些存在版本冲突问题的jar包做整理,也就是有依赖关系的。
  • 使用我这套面向报错编程,报错基本上都是ClassNotFound的一类的异常,因为starter肯定会把相关的存在依赖关系的jar都进行整理,出问题是你没导入那些和别的包没有依赖关系的包。
  • 如果用redis,找找redis-spring-boot-starter或者spring-boot-starter-redis。用什么找什么,基本上熟练几次,我们就能很多的时间找全我们要的jar
  • 这种starter的方式比传统的方式除了导入的少以外,最终要的版本至少不会出问题,所以出问题了,版本肯定没问题,也就是jar包层面,多去把功夫放在你的业务逻辑代码中吧!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值