HTTP Status 500 - java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/jasper/servlet/JasperLoader) previously initiated loading for a different type with name "javax/servlet/http/HttpServletRequest"
这个错误应该怎么解决?
我把全网能找到的方案都试了个遍,包括将servlet-api.jar和jsp-api.jar的scope属性改为provided,pom文件中的dependecy也改了,但还是不行
我大概知道是jar包冲突引起的问题,请问该如何解决?
解决办法:
百度上好多都说这样解决:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
原因是 配置依赖插件的时候,没有加 <scope>provided</scope>
导致servlet-api的jar或者jsp-api的jar包与tomcat服务器运行时自带的jar包相冲突
这种原因是大多数网友 遇到的问题.
但是,我的项目加了 <scope>provided</scope>
依然报错,错误信息还是下面的 没变化,
经过 不懈努力…终于找到了问题的源头:
在自己电脑安装的jdk的jre中还有 一个servlet.jar,就是这个jar与tomcat运行时的jar相冲突了,删掉之后,完美运行~~~~2333
路径:C:\Program Files (x86)\Java\jdk1.8.0_144\jre\lib\ext
具体路径 参考你们自己的jdk安装的路径
网页上的报错信息:
HTTP Status 500 - java.lang.LinkageError:
loader constraint violation: loader (instance of org/apache/jasper/servlet/JasperLoader) previously initiated loading for a different type with name
"javax/servlet/http/HttpServletRequest"
控制台(tomcat)的报错信息:
严重: Allocate exception for servlet demo2.AServlet
java.lang.ClassCastException: demo2.AServlet cannot be cast to javax.servlet.Servlet
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:865)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:136)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
为方便好看,我给分成了两端:
三月 23, 2019 1:04:23 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [jsp] in context with path [] threw exception [java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/jasper/servlet/JasperLoader) previously initiated loading for a different type with name "javax/servlet/http/HttpServletRequest"] with root cause
java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/jasper/servlet/JasperLoader) previously initiated loading for a different type with name "javax/servlet/http/HttpServletRequest"
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethods(Class.java:1975)
at org.apache.catalina.util.Introspection.getDeclaredMethods(Introspection.java:127)
at org.apache.catalina.core.DefaultInstanceManager.populateAnnotationsCache(DefaultInstanceManager.java:342)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:161)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:149)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
根据问题描述,出现了java.lang.LinkageError: loader constraint violation这个错误,并且可能是由于应用程序同时使用了多个版本的jar包导致的HTTP Status 500的错误。因此,为了解决该问题,可以按照以下步骤进行操作:
首先,需要进一步确认导致HTTP Status 500错误的具体原因,是否是由于 jar 包的冲突引起的。可以查看服务器的日志文件,查找以下关键字:
java.lang.LinkageError loader constraint violation
如果出现了这两个关键字,则可以基本确认该问题的原因是 jar 包的冲突。
接下来,需要找出冲突的 jar 包的具体原因,可以通过以下步骤进行操作:
1) 打开应用程序的 WEB-INF 目录,找到 lib 目录下的 jar 包,检查是否有重复的 jar 包。
2) 如果出现重复的 jar 包,可使用以下命令,在命令行中查找所有的该 jar 包:
Linux / Unix:
find . -name "xxx.jar"
Windows:
dir /s /b xxx.jar
3) 排除其他可能的原因,例如:应用程序代码、配置文件等问题。
解决 jar 包冲突问题的方法有多种,具体选择哪种方法,需要根据实际情况进行选择。
1) 调整 jar 包的顺序
有些 jar 包本身并不冲突,只是因为加载的顺序不同,导致了冲突。通过调整 jar 包的加载顺序即可解决问题。
2) 使用排除依赖的方式
在 Maven 项目中,可以通过排除依赖的方式解决 jar 包冲突的问题。例如:
group-id artifact-id
3) 使用 ClassLoader 隔离
可以使用 ClassLoader 隔离的方式,使得应用程序加载的 jar 包与服务器加载的 jar 包隔离开来。具体实现方式可以参考 Apache Tomcat 官方文档:https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html
总结:
以上是解决 HTTP Status 500 错误,并出现了 java.lang.LinkageError: loader constraint violation 这个错误的具体步骤。需要先确认问题的具体原因,找出 jar 包冲突的具体原因,最后再选择合适的解决方式进行处理。