tomcat 运行jar_图说tomcat(四):加载jsp解析器

我们上文说到直接在bootstrap里面启动tomcat的main函数会报jsp无法解析的错误,有兴趣的小伙伴可以把ROOT目录下的index.jsp 换成index.html,这样访问是可以的,今天我们就来聊一聊这个jsp解析器

以前的启动方法

tomcat官网从来没有推荐过用bootstrap的main函数启动,而是用的bin目录下的startup.sh来启动,我们在第一篇文章寻找main函数也是从startup.sh来入手的,那main函数启动和startup.sh启动有什么区别呢

先附图一张: 用bootstrap启动之后的报错信息

dde0609a95f49888201a33621aa1b00a.png

在这个错误中,我们可以看到一个关键信息: NullPointerException 报了一个空指针异常,我们很容易就可以猜到应该是缺少了什么配置,但是我们用在源码根目录执行 ant deploy即打包tomcat之后的bin目录去启动的时候又是可以正常解析jsp的,那我们就来看看这个ant deploy做了哪些事情

ant deploy

我们在源码根目录找到build.xml打开,找到其中target=deploy

e32bb6ab12e2d4c2b6d6cb3d68871cc1.png

如上图所示,可以看到在执行deploy前会先执行package,build-docs,build-tomcat-jdbc,compile-webapp-examples,通过名字,我们可以大致猜出来,执行了打包,构建文档,构建jdbc,编译web示例。因此最有可能的差别就在于package这一步了,我们跟着找到 target name = "package"

264d956f367ddbc4a4279abb7afb830b.png

会发现,这个target的作用就是打jar包,而且我们通过对比已引入的jar包,可以看到,还缺了一个jsp的jar包,那我们在项目的Libbraries中把jasper这个依赖给加上再启动,就能看到我们熟悉的tomcat界面啦,如下图所示:

396eb717f68d0e1fd6e4cd216cd493dc.png

直接改代码

我们并没有改源码,只是加了jar包就可以运行,而且这个jar包还是从源码中打的包,那么我们猜测,肯定是这个jar包里面写了static方法进行了初始化,顺着这个思路,我们找到了org.apache.jasper.servlet.JasperInitializer这个类,仿照jdbc的写法,我们用Class.forName在tomcat load结束的时候加上这段代码,如下图所示:

17bbe8301022f3ac59331f29b83fff3b.png

这样也可以启动之后访问localhost:8080得到我们常看到的页面

总结

排错能力是编程能力的很大一部分,而且在工作中,大多数时间都在改bug , 找问题,这就需要我们从报错信息一步步的进行分析,并编码验证,最终并解决问题!在开始遇到这个问题的时候,我就直接复制去百度,去谷歌,但收效甚微,因为大家的环境什么的都不一样,然后关于tomcat导入idea中,以及源码运行其实就那几篇博客,其他的都是复制的,还是要多靠自己去分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值