在tomcat中java项目引用velocity无法访问的问题

前言:

小伙伴们大家好,今天带来的是一个在项目中遇到的问题,环境是这样的,项目是SSM的项目,权限认证框架用的Spting Security,页面使用了velocity。当我把这个项目部署到linux上的时候,发现在本地可以启动的项目,现在没有办法打开登录页,一直循环跳转Spring Security的登录请求,经过了两天的百度+源码调查,终于找到了问题,其实问题很简单。下面我来介绍一下这个问题的调查方向和结果,介绍调查方向的原因,是如果有小伙伴有同样的情况,但是不是一个问题的时候,可以用这个思路试一试。

由于我是在linux上,所以我选择了远程代码调试的方法来进行排查。

当我在debug的时候发现方法走完了,没有报错,但是页面没有跳转成功,所以又一次萌生了跟源代码的想法.

不想看跟踪源码的小伙伴,可以直接拉到最后去看解决方式。

跟踪源码

  1. 我们在Spring Security的登录页的代码中找到 return mv的地方(mv 就是 modelAndView对象实例)

  1. 我们在debug中使用下一步,然后他就会跳转到了源码的里面,一直下一步,我们就走到了下图所示的位置

在执行这个方法的过程中,我们发现他报错了,走到了467行的位置,就是说 报了一个Error而不是Exception

this.processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

报错内容

java.lang.NoClassDefFoundError: Could not initialize class org.apache.velocity.tools.view.ViewContext

这里放上报错内容是为了有同样问题的小伙伴可以通过这个报错关键字搜索到这篇文章。

  1. 我们来跟进一下processDispatchResult这个方法,在这里,我们点击进入这个方法快捷键应该是F7,我们发现是走到了一个叫render的方法中报了错

4、我们继续进入this.render方法,发现在一个view.render的一个方法中报了错

5、我们继续进入view.render方法,发现在一个this.renderMergedOutputModel的一个方法中报了错

6、我们继续进入this.renderMergedOutputModel方法,发现在一个this.renderMergedTemplateModel的一个方法中报了错

7、我们继续进入this.renderMergedTemplateModel方法,发现在一个this.createVelocityContext方法中报了错

8、我们继续进入方法,发现在new ChainedContext实例的时候就报错了

9、我们先排除一下参数中的错误,我们在debug的时候将参数输出出来

10、发现参数正常,那就是 ChainedContext对象实例化的时候报了错,我们进入他的构造方法当中,发现他调用另一个构造方法的时候报了错

11、我们继续跟进,发现方法里只有一个调用父类构造方法的语句,我们继续跟进

12、到这里,我们发现是一个赋值语句报了错

但是,给字符串复制为null为什么会报错呢,很显然不是这个问题,那么为什么这句话报了错呢,我们发现“DEFAULT_TOOLBOX_KEY ”这个字段并不是这个类里的,那么有没有可能是这个字段在赋值的时候报了错呢,我们ctrl点一下这个字段,发现里面还有一层

13、我们继续往下点,然后我们终于在ViewToolManager类中找到了这个字段,那么我们在当前类搜索一下这个字段,看看是在哪里进行的赋值,发现在当前类的最下方有一个静态块对其进行了赋值

14、接下来,我们来看一下Toolbox.KEY 这个字段的状况,看到这个,发现这个KEY为啥没有高亮嘞。我们点一下这个KEY,发现点不了

我们进入到Toolbox类,发现并没有这个类,那么我们来看一下这个是哪个jar包。

发现是这个jar包,我们再用本地能登录的情况跟到这个里的时候发现是有KEY这个属性的

15、发现一个是正式版,一个是beta版,将beta版删除之后,问题就解决了

那么我基因里的程序员之魂告诉我 另外一个问题来了, 为什么会报java.lang.NoClassDefFoundError: Could not initialize class org.apache.velocity.tools.view.ViewContext 这个错误呢,完全不沾边呀。后来读到了一个大佬的一篇博客

https://blog.csdn.net/u010548207/article/details/106074569/

我们通过这篇博客发现了,需要在第一次加载的时候才能发现问题所在,所以重启tomcat,进行第一次的测试,我们走到第12步的时候,发现报错不一样了,这次的报错是

velocity java.lang.NoSuchFieldError: KEY

至此,我们就知道了为什么会变成这样的原因。

问题解决方法

通过上述的源码跟踪,我们发现是两台服务器调用的jar包不同导致的,beta这个版本的代码没有KEY这个字段,所以,将这个beta这个版本的jar包删除掉,使用正式版的jar包问题就解决了。

如果有什么疑问,或者指教 欢迎加QQ:1318623133

----------------------------------------- I`m Joshua,may god bless you

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值