java - 尝试登录会生成 java.lang.NoClassDefFoundError 和 java.lang.ClassNotFoundException 错误

标签 java eclipse error-handling noclassdeffounderror classnotfoundexception

这是我的场景。 我有一个正常运行的登录表单。我已尝试安装 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/

相关文章:

java - 使用 Google OAuth2 授权服务器保护 Spring RESTful API

java - Japanel 中带有 jList 的滚动 Pane 不起作用

java - 在java中哪里使用 "this"?

java - 如何将弧度转换为度数

java - Eclipse Kepler 在警告上显示错误标记

java - 类型不匹配 : cannot convert from Set<Object> to Set<Long>

java - 在 Ubuntu 上编译时从 Eclipse 转换为 Dalvik 格式失败错误

angular - 从Angular 2/4中的正常函数处理错误

perl - 如何处理 Perl 子例程中已捕获和 Uncaught Error ?

php - 网络服务器上的错误监控/处理