起因就是组内旧项目也要接入现有的微服务部署,该项目大致上就是后台MVC和前端JSP写在了一起,还用了一堆shiro、mybatis-plus这些组件,整改过程想必问题很多,所以写一篇博客,事无巨细,都简单地记录下来。
原项目目录结构如图:
被我一顿换后,改了pom.xml文件加了启动类,有点boot项目的样子了,项目结构如图:
其实就是原封不动的复制过来,只在资源文件夹里加了application.xml,并且java文件夹项目路径中写了启动类,再调了调文件夹类型而已。先启动再说吧,接下来就是一个一个的报错解决。
一.spring boot版本不合适
点异常栈信息最后知道是因为缺少DataSize这个类,这个类是在spring-core这个spring核心jar里面的,项目中该jar的版本是4.3.8.RELEASE,这个版本中确实没有这个类。一开始我使用的spring-boot-starter是2.1.9.RELEASE版本,这个版本默认spring核心jar包都是5.1.10.RELEASE,这个版本是适配的里面有DataSize,我也尝试过将spring核心jar包版本都换成5.1.10.RELEASE,但项目多处直接报错,看来原则就是尽量不改项目原有的东西,那就只能改spring-boot-starter的版本喽,最后在maven repository里找到了spring-boot-starter的1.4.6.RELEASE版本,这个版本的spring核心jar包都是4.3.8.RELEASE,这样果然就ok了,好吧,将就用吧。
二.编译语言版本不够导致编译报错
这个简单,将maven编译插件指定语言版本就行了,如下:
这种问题在IDEA里面好像也可以设置 ,不过这种方式还是最稳的。
三.pom.xml里面如果有重复依赖遵循路径最短,申明顺序其次原则。
报错就是代码里有一个地方Cookie的setHttpOnly这个方法不存在,想必又是jar版本的问题。看了一下原项目Cookie这个类所在的jar版本是3.1.0,但是我也没改这个jar包版本啊,看了一下现在项目的maven的依赖树,发现Cookie这个类所在的jar包版本居然变成了2.4,后来发现其实这两次看的不是一个jar包,原来是因为项目中同时引用了servlet-api和javax.servlet-api这两个jar包,但是这两个jar包的类路径都是相同:
pom.xml里面如果有重复依赖遵循路径最短,申明顺序其次原则。原项目中pom.xml中的引用是3.1.0的javax.servlet-api在先而2.4的servlet-api在后,这里两个jar包都是直接引用所以路径相同,所以原项目用的是声明顺序在先的3.1.0的javax.servlet-api,而我本着pom文件太难看不经意的把这两个换了一下顺序,就导致报这个错,好吧,先不追究为什么要引用两个相同路径的jar包,看来雷真不少,原项目的东西动哪里都要慎重。
四.这个版本的spring boot居然还需要自己引入tomcat核心jar包。
根据异常栈信息可以定位到getEmbeddedServletContainerFactory()抛的异常,看一下这个方法: