SpringBoot2.x项目部署遇到的一些坑及解决方法

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<TomcatServletWebServerFactory> cookieProcessorCustomizer() {
        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中用来做缓存的,所以最好还是不改里面的,如果有好办法,会分享的

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴中第一皇子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值