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