1.环境
项目是SpringBoot2.x,部署的tomcat版本略低为8.0
2.问题
(1)首先打war包,这里遇到了最痛苦的坑。首先打war包的话我有一篇博客已经写了,可以自行查看。打war如果用maven的话就是先maven clean然后再maven install,但是这里出现了报错,报错内容我没有截取下来,大概就是:
程序包***********不存在,********找不到符号(*号对应的路径是第三方jar包路径)
我先说下自己的心路历程:首先一开始我发现只有mavne clean之后直接使用install会失败,如果先maven > update project 是不会报错的,我就心怀侥幸,就不去解决这个问题,结果发现,通过这种方法打出的war包放在tomcat下运行会直接报错,错误就是缺少了xxx包导致初始化bean失败,然后我一开始以为是tomcat问题,是不是tomcat版本问题,最后发现都不是,一想那就是maven的问题嘛,就是打包的时候少包了,但是又没提示报错。找了很多办法都没有,然后我一气之下把maven仓库清了,重新让他下jar包,结果,还真成功了。所以总结了一点:像这种少jar包之类的问题,多半就是maven仓库有问题了,直接清仓,如果不舍得清,就先再搞个maven,先试下,就可以了,目前项目已经可以运行了。
(2)当maven->clean后直接启动程序,报错xxx主类未找到,这个错误是由于maven->clean后会将编译的class文件也删除掉,所以需要重新对代码进行编译,有两种方法,第一种是update project,当maven的更新完后会对代码重新编译,第二种就是projuct -> clean,这也会对代码进行重新编译
(3)当多个springboot运行在同一个tomcat下,会报错,在application.yml下添加一行:
spring:
jmx:
enabled: false
(3)cookie报错:
An invalid domain [.xxx.com] was specified for this cookie
原因:导致这个的原因就是tomcat版本问题,因为到8.5之后tomcat对cookie的处理机制就变的不同了
解决方法:其实就两种处理方式,一种Rfc6265CookieProcessor,一种是LegacyCookieProcessor,而8.5之后默认使用前者,这两种在用法上可以自行百度,前面一种的domain域只能以字母或数字开头,而后者则是以 . 开头,所以有两种方法,都是在配置文件中加入一段代码就可以:
//修改cookie域名识别机制,
@Bean
public WebServerFactoryCustomizer
return (factory) -> factory.addContextCustomizers(
//不以 . 开头的用这个
(context) -> context.setCookieProcessor(new Rfc6265CookieProcessor()));
//以 . 开头用这个
(context) -> context.setCookieProcessor(new LegacyCookieProcessor()));
}
注意:虽然8.5之后默认使用Rfc6265CookieProcessor处理,但是如果不加上面这个配置也是有可能会报错,这个自己研究,反正加上上面的配置就肯定没问题
(4)静态资源访问不了,即访问页面没有css样式,加载不了js等静态资源
有多种可能,我列举我遇到的两种:
1.虽然SpringBoot默认的静态资源地址是resources下的static,但是他只限存放文件,即如果你在static下直接放css样式是可以访问的,但是为了管理,我们一般都会在static下新建文件夹,如css,js等分类。这样的话就会出错了,因为SpringBoot不会访问到static文件夹下的子文件夹:
像这种结构目录就不会被直接访问,所以必须再加个配置
public class specificStaticFilePath implements WebMvcConfigurer{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
2.这种是我遇到的,也不怎么容易发现的bug。我们linux服务器上是用oneinstack自动部署的服务,如mysql,java,nginx,tomcat等,都是自动装的。而我们部署的时候是用的虚拟节点。访问时通过nginx转发:
这是某个虚拟借点上nginx的配置,通过配置我们知道,当访问80端口时,会默认转到/data/wwwroot/rwuser.mihuan-net.com本地路径,而此时将项目部署到该路径下,由于SpringBoot解压war包后结构和传统的war包不同,即静态文件全部都在WEB-INF下,所以只能访问接口,访问不了静态资源。这时就需要利用proxy_pass代理进行反向代理,通过配置可知道,当匹配到某个location后会执行其中的内容,而都没有匹配则会执行最后一个location,即:
location ~ {
proxy_pass http://127.0.0.1:8080;
include proxy.conf;
}
所以这里有以下几种解决方法:
第一种:不用nginx,直接使用tomcat
第二种:修改上面的配置为:
即不匹配js,css,直接进入最后的反向代理,但是这种方法有问题,如果你静态资源里面存在图片,视频等,就会在上面就被拦截,进入不了最后的方向代理,所以又需要将上面的location注释掉
第三种:将location配置全部注释掉,只留最后一个。
第四种:将解压出来的war包中的静态文件全部移到最外层,不放在WEB-INF中,这是最有效的,但是每次都要移动就会有点麻烦,所以可以自己写一个shell脚本。
可能会有更好的办法,毕竟上面location中用来做缓存的,所以最好还是不改里面的,如果有好办法,会分享的