我们上文说到直接在
bootstrap
里面启动tomcat的main函数会报jsp无法解析的错误,有兴趣的小伙伴可以把ROOT目录下的index.jsp
换成index.html
,这样访问是可以的,今天我们就来聊一聊这个jsp解析器
以前的启动方法
tomcat官网从来没有推荐过用bootstrap
的main函数启动,而是用的bin目录下的startup.sh来启动,我们在第一篇文章寻找main函数也是从startup.sh来入手的,那main函数启动和startup.sh启动有什么区别呢
先附图一张: 用bootstrap启动之后的报错信息
在这个错误中,我们可以看到一个关键信息: NullPointerException
报了一个空指针异常,我们很容易就可以猜到应该是缺少了什么配置,但是我们用在源码根目录执行 ant deploy
即打包tomcat之后的bin目录去启动的时候又是可以正常解析jsp的,那我们就来看看这个ant deploy
做了哪些事情
ant deploy
我们在源码根目录找到build.xml打开,找到其中target=deploy
如上图所示,可以看到在执行deploy前会先执行package
,build-docs
,build-tomcat-jdbc
,compile-webapp-examples
,通过名字,我们可以大致猜出来,执行了打包,构建文档,构建jdbc,编译web示例。因此最有可能的差别就在于package这一步了,我们跟着找到 target name = "package"
会发现,这个target的作用就是打jar包,而且我们通过对比已引入的jar包,可以看到,还缺了一个jsp的jar包,那我们在项目的Libbraries中把jasper这个依赖给加上再启动,就能看到我们熟悉的tomcat界面啦,如下图所示:
直接改代码
我们并没有改源码,只是加了jar包就可以运行,而且这个jar包还是从源码中打的包,那么我们猜测,肯定是这个jar包里面写了static
方法进行了初始化,顺着这个思路,我们找到了org.apache.jasper.servlet.JasperInitializer
这个类,仿照jdbc的写法,我们用Class.forName
在tomcat load结束的时候加上这段代码,如下图所示:
这样也可以启动之后访问localhost:8080
得到我们常看到的页面
总结
排错能力是编程能力的很大一部分,而且在工作中,大多数时间都在改bug , 找问题,这就需要我们从报错信息一步步的进行分析,并编码验证,最终并解决问题!在开始遇到这个问题的时候,我就直接复制去百度,去谷歌,但收效甚微,因为大家的环境什么的都不一样,然后关于tomcat导入idea中,以及源码运行其实就那几篇博客,其他的都是复制的,还是要多靠自己去分析。