我收到以下错误:
INFO:validateJarFile(C:\ dev \ server \ tomcat6 \ webapps Sempedia \ WEB-INF \ lib \ servlet-api.jar)-未加载jar。参见Servlet Spec 2.3,第9.7.2节。令人反感的类:javax / servlet / Servlet.class
那里的现有资源说,这是由于与servlet.jar冲突,在本例中为servlet-api.jar文件。我已经从/ webapps文件夹中删除了所有其他项目,我已经获取了tomcat6 / lib目录中的servlet-api.jar文件,并将其添加到了项目构建路径中,所以我看不到仍然是一个冲突。
当我尝试运行应用程序时,得到以下堆栈跟踪。
org.apache.jasper.JasperException:无法为JSP编译类:
在生成的Java文件中的第22行发生错误:对于类型JspFactory,未定义方法getJspApplicationContext(ServletContext)。
堆栈跟踪:
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)
这是类路径污染的标志。JSP / Servlet API库是与appserver实现有关的,并且在Tomcat/lib文件夹中是Tomcat 6的情况下属于JSP ,因此绝对不应将其移动或复制到其他位置。正如你现在遇到的那样,它是可移植性问题和类加载冲突的良方。webapp中的库在类加载中具有优先权。如果在servlet-api.jar那里遇到,则依次在其中查找其依赖项,但显然在那里缺少它们。
你必须从webapp的中删除所有特定于appserver的库Webapp/WEB-INF/lib。你只应在其中放置特定于Webapp的库。将特定于应用程序服务器的库保留在应用程序服务器自己的默认类路径中,Tomcat/lib你可以使用此默认路径。保持原状。你最多可以添加要在其中的所有Web应用程序之间共享的库,或者甚至更好地为此配置shared.loaderin Tomcat/conf/catalina.properties。
此外,还从JDK/lib和JRE/lib文件夹中删除所有特定于appserver和webapp的库。我经常看到一些入门者将库移动/复制到那里,因为“否则它不会编译”。你永远不要在其中复制非JRK / JRE特定的库。这也是可移植性问题的解决方案。使用编译类时javac,应使用-cp参数指定从属库。
更新:如果是IDE(在谈论“构建路径”时似乎使用了一个),则需要将Web项目与应用程序服务器关联。例如,在Eclipse中,你可以选择在创建Dynamic Web Project期间执行此操作。在创建项目之前,你需要在Eclipse中集成服务器实例。你可以通过Servers视图来做到这一点(假设你正在将Eclipse用于Java EE开发人员,否则进行升级)。你还可以随后通过服务器进行更改在项目属性中输入。选择一个你想用作“默认”服务器的服务器,然后其库将自动包含在项目的构建路径中。绝对没有必要在其他地方复制/移动它们。另请参见如何在Eclipse项目中导入javax.servlet API?