关于Tomcat7无法编译jsp页面的解决方法

由于工作需要,要把外包给别的公司的项目发布到公司服务器上,本地测试全部通过,但是有一些在系统中没有用到的无关紧要的JSP页面有错误,这些错误时由于系统升级遗留下来的因为API换了导致的错误。

重点来了,本地测试好好的,发布到服务器上时,因为Tomcat无法编译部分系统用到的JSP页面,这下好了,一直显示无法加载类或是class文件不存在。错误截图如下:


在查看了Tomcat日志后,我发现了应用下的一个包没有被引入,而且这个包就是servlet-api.jar,以前遇到过这个包跟Tomcat自带的冲突导致程序运行不起来,所以我直接删了这个jar包,tomcat重启后页面正常访问。大功告成?No No No。在我满心欢喜的查看后台管理页面时,又发现了差不多一样的问题,请看截图:


哎 class文件未找到,这是怎么回事呢。我们都知道jsp页面本质是一个servlet或者说是一个java文件,只是被包装成.jsp后缀的文件了而已,但总归是要在jsp页面第一次被访问时转换成servlet,然后生成.class文件的。总的来说出现这个错误的可能有三个:页面有错误、jar包冲突、Tomcat容器出错。按理来说Tomcat容器是不太可能出错的,但一般我们排除错误时,往往可能从最不可能出现错误的地方查起,这就导致了我们排错的效率低下。

先说下配置:Tomcat 7.0.64,JDK1.7.0.79

我说下我的错误的排错之旅:因为刚开始不熟悉Tomcat的一些详细配置,毕竟以前我也只是写代码而已,没怎么关注过Tomcat具体怎么配置程序才有好的性能啊什么的。一开始出错,我就问外包公司的项目对接人员,他们服务器上的配置,然而我并没有完全按照他们使用的版本配置,我总共换了三个Tomcat,刚开始的Tomcat7,接着的Tomcat6.0.44,最后是外包公司的版本Tomcat6.0.30。在换了前两个Tomcat依然无法编译jsp时,我又换回了Tomcat7,因为是开发常用的版本。

前面的思路行不通,我就想到,能不能直接把本地编译好的jsp的class文件上传到Tomcat下work相同目录下,即/work/Catalina/localhost/_/org/tomcat/jsp/下的同目录下。重启了一下Tomcat,后台页面居然真的没错了。唉 这下也不能说搞定了。为什么呢,因为这种办法持续了没多久,在我再次启动Tomcat时,前台后台一起出现了前面所说的同样的错误。真折磨人呐 咱一个小小的程序员,用得着这样嘛。哈哈 发下牢骚。其实这也是很多开发人员常常遇到一个问题,就是刚刚接触到新事物时,常常是懵懵懂懂的状态,用了人家的框架啊什么的,原理都不懂,出事了赶紧找度娘,搜来搜去,直到哪个方法解决了你的问题,这时猿媛们就放弃继续深入学习的劲头了。

哈哈 又唠叨了一堆话。最后实在没办法,硬着头皮去改系统的源代码,哎呀妈呀,这半升级版残废的系统,写的有些好有些坏,还没升级完就给我们用了,真不厚道。最后,在改源代码的过程中,我发现程序规范真的很重要,为什么呢,因为当你看到别人烂成一坨翔的代码你的感受就深了偷笑。一般来说,在公司写的代码都应该尽可能的规范,因为你不知道什么时候你的代码可能被重用,如果你写的代码在重用时出了问题,公司不找你找谁。另外一个问题,就是变量初始化,由于jsp页面上通过jsp各种表达式什么的嵌入了大量的java代码,页面有点混乱,好些变量只有声明没有初始化,这可能会导致运行时异常。还有一个问题是关于泛型的,像ArrayList这样的集合类,在初始化时没有声明具体要放入集合的类型,这时集合对元素的类型检查就比较麻烦,而如果你在初始化时就声明具体的元素类型,这时在你放入另外一个类型时,集合会很容易的发现问题并抛出异常,具体啥异常忘了。其实这一块我也只是懂一点点,就让我装一下吧大笑。最后一个问题就是关于javascript和jsp页面规范。有些人在写代码的时候,容易把两者的注释表达式啊之类的混合着用,这难道有错?没有,只是你错误的混用了而已。由于javascript是一种弱类型语言,所以很多人未了省事,不给变量初始化,当这个变量不是普通的数据类型,例如数组、对象呢,这时就可能导致页面的错误了。

其实在我检查修改了源代码后,系统的所有页面已经可以正常的在Tomcat7下正常的运行了,包括前面出错的页面。慢着,还没说完Tomcat6.0.30呢,解决了问题后,我再次想想验证一下原来系统为什么能在本地测试时正常运行,本地测试是直接MyEclipse发布到,但是找不到问题。最后我又按照外包公司的Tomcat版本来配置运行未修改过的系统,我的妈呀,系统活的好好的喔,页面错误不用修改直接就能正常运行,百思不得其解。问了项目对接人员,也说不知道,有没哪位大神知道告诉我一声呀。难道是Tomcat6.0.30的容错性比Tocat7.0.64的好安静




©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页