java错误:未加载Servlet Jar。。。有问题的类:javax/servlet/servlet。班
我得到以下错误:
INFO: validateJarFile(C:\dev\server\tomcat6\webapps Sempedia\WEB-INF\lib\servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, sectoin 9.7.2. Offending class: javax/servlet/Servlet.class
现有的资源表明,这是由于与servlet冲突造成的。jar或在我的例子中命名为ServletAPI。jar文件。我已经从/webapps文件夹中删除了所有其他项目,我已经使用了servlet api。jar文件,该文件位于tomcat6/lib目录中,并且仅将其添加到项目构建路径中,因此我看不出仍然存在冲突
当我尝试运行应用程序时,我得到以下堆栈跟踪
组织。阿帕奇。贾斯珀。JasperException:无法为JSP编译类:
An error occurred at line: 22 in the generated java file The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92) org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330) org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439) org.apache.jasper.compiler.Compiler.compile(Compiler.java:334) org.apache.jasper.compiler.Compiler.compile(Compiler.java:312) org.apache.jasper.compiler.Compiler.compile(Compiler.java:299) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
# 1 楼答案
您收到的第一条错误消息是,Tomcat不需要加载servlet jar,因为它已经有了一个,并且希望避免冲突
你通常可以放心地忽略这个警告。如果你不想让它出现,你需要将servlet jar从你的项目中移出,而不是使用tomcat中的servlet jar。通过使用tomcat one并将其放入您的项目中,您已经成功说服tomcat从您的webapp加载它,而不是从它预期的位置加载它,从而导致了BalusC的回答中提到的类加载器问题
编辑:对上面的内容进行了编辑,以澄清将tomcat中的servlet api jar放入webapp(以及属性BalusC)后发生了什么
# 2 楼答案
这是类路径污染的迹象。JSP/Servlet API库依赖于appserver实现,在Tomcat 6的情况下属于
Tomcat/lib
文件夹,不应以任何方式移动或复制到其他地方。正如您现在所遇到的,这是导致可移植性问题和类加载冲突的原因。webapp中的库在类加载中具有优先权。如果在那里遇到servlet-api.jar
,它会在那里寻找它的依赖项,但它们显然在那里丢失了您必须从webapp的
Webapp/WEB-INF/lib
中删除任何特定于appserver的库。你应该只把特定于webapp的库放在那里。将特定于appserver的库保存在appserver自己的默认类路径中,在您的示例中是Tomcat/lib
。保持原样。你最多可以添加你想在所有webapp中共享的库,或者更好的是,在Tomcat/conf/catalina.properties
中配置shared.loader
如果有的话,还可以从
JDK/lib
和JRE/lib
文件夹中删除任何特定于appserver和webapp的库。我经常看到一些初学者在那里移动/复制库,因为“否则它无法编译”。永远不要在其中复制非JRK/JRE特定的库。这也是造成便携性问题的原因。使用javac
编译类时,应该使用-cp
参数指定依赖库更新:如果是IDE(您在谈论“构建路径”时似乎使用了IDE),则需要将web项目与应用程序服务器相关联。例如,在Eclipse中,您可以在创建动态Web项目时选择这样做。在创建项目之前,需要在Eclipse中集成服务器实例。您可以通过
Servers
视图(假设您使用的是eclipseforjavaEEdevelopers,否则升级)。之后,您还可以通过项目属性中的服务器条目对其进行更改。选择一个您想用作“默认”服务器的,然后它的库将自动包含在项目的构建路径中。绝对没有必要将它们复制/移动到其他地方。另见How do I import the javax.servlet API in my Eclipse project?# 3 楼答案
正如其他答案所说,这是因为WAR包含servlet API类,但它不应该这样做
如果您使用Maven来构建项目,您将希望告诉Maven在编译和测试时使servlet API可用,但不要将其包括在WAR中。正如Maven documentation about dependency scope所说,您应该为Servlet API使用
provided
作用域:如果您的一些依赖项将Servlet API作为编译依赖项引入,那么您可能还必须明确地将Servlet API作为可传递依赖项排除在外:
# 4 楼答案
不允许您部署覆盖由web容器提供的Servlet规范中定义的类。您可以从
http://www.jcp.org/aboutJava/communityprocess/final/jsr053/
自己检查一下。第9.7.2节见第63页
Servlet 2.3是一个相当旧的版本,表示Tomcat的一个古老版本。有没有什么特别的原因让你不用新的
# 5 楼答案
事实上,我有这样的错误和应用程序。无法开始,因为出于某种原因,
WEB-INF/lib
中的一些JAR具有.JAR
(大写)扩展名,而不是.jar
。所以要确保所有的罐子都是有效的# 6 楼答案
排除和
provided
依赖项在子项目中不起作用如果在Maven项目中使用继承,则必须在父
pom.xml
文件中包含此配置。你的pom中将有一个<parent>...</parent>
部分。xml如果您使用的是继承。所以在你的父母pom.xml
中会有这样的东西: