问题点描述:
之前使用eclipse开发的web项目,现在使用IntelliJ IDEA。于是就将eclipse里的一个web项目导入到了Idea中变成了一个maven项目。等一切都配置好之后启动Tomcat,然后开始运行程序,爆出以下Error
java.lang.LinkageError: loader constraint violation:
when resolving method "org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager
(Ljavax/servlet/ServletConfig;)Lorg/apache/tomcat/InstanceManager;"
the class loader (instance of org/apache/jasper/servlet/JasperLoader)
of the current class, org/apache/jsp/WEB_002dINF/jsp/login_jsp,
and the class loader (instance of org/apache/catalina/loader/StandardClassLoader)
for the method's defining class, org/apache/jasper/runtime/InstanceManagerFactory,
have different Class objects for the type org/apache/tomcat/InstanceManager
used in the signature
整的一头懵逼,无奈去找了度娘,说是jar包冲突问题。找到两种解决方式,亲测可用
方式一:
我之前的web项目的lib包下有
jsp-api-2.2.jar
jstl-1.2.jar
tomcat-api-7.0.52.jar
tomcat-el-api-7.0.52.jar
tomcat-jsp-api-7.0.52.jar
tomcat-servlet-api-7.0.52.jar这些文件与to
tomcat服务下lib包中的jar包冲突,删除WEB-INF-->lib下的jar包即可
方式二:在tomcat的配置文件context.xml中配置一个参数 <Loader delegate="true" />, 就可以解决
True,表示tomcat将遵循JVM的delegate机制,即一个WebAppClassLoader在加载类文件时,会先递交给SharedClassLoader加载,SharedClassLoader无法加载成功,会继续向自己的父类委托,一直到BootstarpClassLoader,如果都没有加载成功,则最后由WebAppClassLoader自己进行加载。
False,表示将不遵循这个delegate机制,即WebAppClassLoader在加载类文件时,会优先自己尝试加载,如果加载失败,才会沿着继承链,依次委托父类加载。
讲真的方式二我不明白,<Loader delegate="true" />引用连接https://segmentfault.com/q/1010000000155690