Linux 部署tomcat服务获取不到bean

1. 项目场景

最近搞了一个老项目采用tomcat war形式部署,Idea项目本地启动和windows tomcat8启动没问题,但是部署到linux上后无法启动成功。

2. 问题描述

项目部署到linux上后无法启动成功,多次打包后上传war包启动,偶尔可以启动成功,非常奇怪。
查看日志发现 privCache bean无法注入ioc。

3. 原因分析

3.1 日志分析

主要日志:

Error creating bean with name ‘privCache’ defined in URL [jar:file:/data/apache-tomcat-8.5.68/webapps/gas/WEB-INF/lib/cloud-priv-service-2.0.6-patch-1.jar!/spring/spring-config-priv.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException

Caused by: java.lang.NullPointerException
at com.gsafety.cloudframework.common.base.util.SpringUtil.getBean(SpringUtil.java:38)
at com.gsafety.cloudframework.priv.util.PrivCacheUtil.initDbPriv(PrivCacheUtil.java:37)
at com.gsafety.cloudframework.priv.util.PrivCacheUtil.initPrivInfo(PrivCacheUtil.java:27)

  • 分析:项目中使用了SpringUtil.getBean获取bean的方式,但是此时这个bean并没有被注入ioc,所以拿不到对象,导致启动失败。
  • 对比成功日志和失败日志
    二者bean的加载顺序不一致。初步怀疑无法启动成功和bean的加载顺序有关。那么为什么windows和本地没有问题,linux会出现问题?

3.2 jar包加载顺序

  1. $java_home/lib 目录下的java核心api
  2. $java_home/lib/ext 目录下的java扩展jar包
  3. java -classpath/-Djava.class.path所指的目录下的类与jar包
  4. $CATALINA_HOME/common目录下按照文件夹的顺序从上往下依次加载
  5. $CATALINA_HOME/server目录下按照文件夹的顺序从上往下依次加载
  6. $CATALINA_BASE/shared目录下按照文件夹的顺序从上往下依次加载
  7. 我们的项目路径/WEB-INF/classes下的class文件
  8. 我们的项目路径/WEB-INF/lib下的jar文件
  9. 同一文件夹,window上到下,linux下到上

原来windows和linux对jar的加载顺序是相反的,但是即使相反也不会导致bean注册不上,因为这个bean在lib下,应该首先被加载。而且日志中bean的加载是无序的。(类似 b.jar,a.jar,z.jar …)

3.3 关于tomcat WEB-INF/lib下类加载顺序问题

tomcat5-7对于WEB-INF/lib下的jar的搜索会按字母排序,tomcat8以上不会排序,依赖文件系统随机返回文件列表,这样的话tomcat8在不同的机器上可能出现运行时加载类混乱的问题,从而发生诡异的问题。

现在服务器上是tomcat8.x.x版本,所以类加载存在不确定性。导致SpringUtil.getBean获取不到bean的对象。

4. 解决方案

下载tomcat7.x.x版本进行部署,部署成功!tomcat-7.0.108 解压版

5. 存疑

linux tomcat8 在一定几率下可以成功启动。
怀疑是war在解压的过程中解压进度刚好是有序的或者刚好把存在问题的bean按序加载了,导致启动成功。
希望有相关经验的同行答疑。毕竟tomcat7已经被apache弃用了。
在这里插入图片描述

6. tomcat8 解决方案(没有效果)

网上找的解决方案,但是实测没有效果!
tomcat的conf目录下修改context.xml文件,加上如下语句就可以办到了:

<Resources>
    <PreResources className="org.apache.catalina.webresources.FileResourceSet"                
            base="${catalina.base}/webapps/你的项目名称/WEB-INF/lib/提到前面来的冲突jar包名.jar"                 
            webAppMount="/WEB-INF/lib/提到前面来的冲突jar包名.jar" />
</Resources>

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr-Wanter

感谢大佬

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

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

打赏作者

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

抵扣说明:

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

余额充值