这是我的场景。 我有一个正常运行的登录表单。我已尝试安装 ESAPI 以保护表单。
这样一来,现在当我尝试登录时,浏览器中会生成此消息:
java.lang.NoClassDefFoundError: org/owasp/esapi/ESAPI
at com.tunestore.action.LoginAction.execute(LoginAction.java:43)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.tunestore.servlet.PersistenceFilter.doFilter(PersistenceFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.owasp.esapi.ESAPI
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1671)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
... 31 more
ROOT CAUSE
java.lang.ClassNotFoundException: org.owasp.esapi.ESAPI
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1671)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
at com.tunestore.action.LoginAction.execute(LoginAction.java:43)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.tunestore.servlet.PersistenceFilter.doFilter(PersistenceFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
我正在使用 Eclipse Java EE IDE Indigo Service Release 1。
我已经进入项目的属性并将 esapi-2.0.1.jar 文件添加到库中。
这就是所有应该需要的,但我收到了上面的消息。为了排除故障,我做了以下操作:
此外,我已经向下钻取并手动将源附件和 native 库位置指向 esapi zip 文件附带的 src 和 lib 目录。
我将项目配置为使用 JDK,因为它是使用 JRE 作为“已安装的 JRE”创建的。
通过:
- 右键单击项目名称。
- 选择“属性”、“Java 构建路径”
- 单击“库”选项卡。
- 点击“添加库”,选择“JRE系统库”,下一步
- 选择最下面的项目:Workspace default JRE (jdk1.x.x. etc....)
- (注意它现在是 JDK 而不是 JRE!)
- 点击“完成”
- 现在删除 JRE 库,这样您就只有 JDK 库了。
- 例如:JRE 系统库 [JavaSE-1.6]
- 点击“确定”
接下来,我通过执行以下操作将 Eclipse 配置为使用 JDK 而不是 JRE:
- 窗口->首选项->Java->已安装的 JRE
- 点击“添加”、“标准虚拟机”、“下一步”
- 对于“JRE 主页”,单击“目录”
- 找到您的 JDK 目录...
- 例如:C:\java\jdk1.6.0_24
- 点击“完成”
- 接下来检查列出的 JDK 与 JRE。
- 点击“确定”
为了确保 .properties 文件被识别,我还添加了
-Dorg.owasp.esapi.resources="c:\.esapi"
到默认 VM 参数。
我还在此处列出的 JRE 系统库中添加了相同的 esapi-2.0.1.jar 文件。
最后我在 Project Explorer 中进入我的项目并从 Libraries > JRE System Library > esapi-2.0.1.jar > org.owasp.esapi > ESAPI.class > ESAPI 向下钻取,它说它现在有源,所以我浏览到提取 esapi zip 文件的同一个 src 文件夹。
通过所有这些步骤,错误保持不变。
最佳答案
Web 应用程序的类路径由/WEB-INF/classes、/WEB-INF/lib 中的所有 jar 和 Web 服务器本身的类路径(在本例中为 tomcat)构成。您添加到 eclipse 项目类路径的库不会随应用程序一起部署。所以如果你不把它们放在tomcat的类路径中,那么在运行web应用程序时它们就不会在类路径中。
在这种情况下,您当然应该从 eclipse 构建路径中删除库,并将 jar 放到 WEB-INF/lib 中。 Eclipse 将使其自动可用于组合,并且将自动与 Web 应用程序一起部署并在运行时位于其类路径中。
关于java - 尝试登录会生成 java.lang.NoClassDefFoundError 和 java.lang.ClassNotFoundException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8194976/