项目中有时候会遇到jar包冲突的问题, 报以下异常
Servlet.service() for servlet [jsp] in context with path [] threw exception [java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;] with root cause
java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/Jsp
是因为 jasper-compiler.jar jasper-runtime.jar 这几个jar包的问题,
因为tomcat6中没有这几个jar包, tomcat7却自带了这几个jar包, 当项目从tomcat6移到tomcat7时, 就会报jar包冲突的错误, 这时候我们经常的选择是删除项目中的jar包,
后来发现在tomcat的context.xml中配置一个参数 <Loader delegate="true" />, 就可以解决,
原因
True,表示tomcat将遵循JVM的delegate机制,即一个WebAppClassLoader在加载类文件时,会先递交给SharedClassLoader加载,SharedClassLoader无法加载成功,会继续向自己的父类委托,一直到BootstarpClassLoader,如果都没有加载成功,则最后由WebAppClassLoader自己进行加载。
False,表示将不遵循这个delegate机制,即WebAppClassLoader在加载类文件时,会优先自己尝试加载,如果加载失败,才会沿着继承链,依次委托父类加载。
网友评论