1

这是我的场景。 我有一个可正常工作的登录表单。我试图安装ESAPI以确保表单安全。
这样,现在当我尝试登录该消息在浏览器中生成:
尝试登录会生成java.lang.NoClassDefFoundError和java.lang.ClassNotFoundException错误

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靛蓝服务发布1

我已经到该项目的属性并将esapi-2.0.1.jar文件添加到库中。

这是所有应该需要但我收到上面的消息。为了排除故障,我做了以下工作:

另外,我已经钻完并手动将源附件和本机库位置指向esapi zip文件附带的src和lib目录。

我将项目配置为使用JDK,因为它是使用JRE作为“已安装的JRE”创建的。
通过:

  • 右键单击该项目的名称。
  • 选择“属性”,“Java构建路径”
  • 单击选项卡“库”。
  • 点击“添加库”,选择“JRE系统库”,然后
  • 选择底部的项目:工作区缺省JRE(jdk1.xx等....)
  • (请注意,它现在是一个JDK和不是JRE!)
  • 单击“Finish”
  • 现在删除JRE libarary,以便只有JDK库。
  • 例如:JRE系统库[JavaSE的-1.6]
  • 单击 “确定”

接下来,我配置的Eclipse通过执行以下操作使用JDK,而不是JRE:

  • 窗口 - >首选项 - > Java的>安装的JRE
  • 点击 “添加”, “标准VM”, “下一步”
  • 对于 “JRE主页”,单击 “目录”
  • 找到您的JDK目录...
  • 例如:C:\ java的\ jdk1.6.0_24
  • 单击 “完成”
  • 接着检查JDK VS列出的JRE。
  • 单击 “确定”

要确保.properties文件被承认我还添加了

-Dorg.owasp.esapi.resources="c:\.esapi" 

到默认VM参数。

我还在此处列出的JRE系统库中添加了相同的esapi-2.0.1.jar文件。

最后我在Project Explorer中进入了我的项目,并从库> JRE System Library> esapi-2.0.1.jar> org.owasp.esapi> ESAPI.class> ESAPI进行了钻取,并声明它现在确实具有这个源代码让我浏览了esapi zip文件被提取的同一个src文件夹。

通过所有这些步骤,错误仍保持不变。

+0

可能的重复[当我尝试在Eclipse中运行我的项目时,为什么我的虚拟机参数的路径不能找到?](http://stackoverflow.com/questions/8191282/why-cant-my-vm- arguments-path-not-be-found-when-i-try-to-run-my-project-in-ecl) –

回答

5

Web应用程序的类路径由/ WEB-INF/classes,/ WEB-INF/lib中的所有jar以及Web服务器本身的类路径(本例中为tomcat)构成。您添加到eclipse项目的类路径中的库不会随应用程序一起部署。所以如果你不把它们放在tomcat的classpath中,它们在运行web应用程序时不会在类路径中。

在这种情况下,您应该从eclipse构建路径中移除该库,然后将该jar放入WEB-INF/lib中。 Eclipse会自动将其用于comoilation,并且它将自动与Web应用程序一起部署,并在运行时位于其类路径中。

+1

谢谢你做到了! – Turk

+0

也为我工作。我正在使用JBoss 7.1。谢谢 :) – thefourtheye