?
???????交代下背景。電腦系統是64位的,用的是64位的Tomcat。安裝是32位的Myeclipse10,java環境也是32位的。Tomcat在開始啟動時會報這樣一個錯誤,“Can't load IA 64-bit .dll on a AMD32-bit platform”。可是不耽誤使用,近期在敲Drp項目中用到了底層接口的幾個方法,這個錯誤導致項目不能正常執行了,所以就將64位的Tomcat換成了與java環境一樣的32位的Tomcat。上面的問題就順利攻克了,于是繼續自己的開發,可是當JSP頁面啟動時就出現了我們這篇文章要說的錯誤“Unableto compile class for JSP”。
?
以下是這個錯誤的具體信息:
嚴重:Servlet.service() for servlet [jsp] in context with path [/drp5.9] threwexception [Unable to compile class for JSP:An error occurred atline: [33] in the generated java file: [D:\計算機\學習課程\第三年\3.J2EE\2DRP_Java項目視頻_王勇\MyDrp\drp\apache-tomcat-7.0.55-windows-x86\apache-tomcat-7.0.55\work\Catalina\localhost\drp5.9\org\apache\jsp\login_jsp.java]
The methodgetJspApplicationContext(ServletContext) is undefined for the type JspFactoryStacktrace:] withroot cause
org.apache.jasper.JasperException:Unable to compile class for JSP:An error occurred atline: [33] in the generated java file: [D:\計算機\學習課程\第三年\3.J2EE\2DRP_Java項目視頻_王勇\MyDrp\drp\apache-tomcat-7.0.55-windows-x86\apache-tomcat-7.0.55\work\Catalina\localhost\drp5.9\org\apache\jsp\login_jsp.java]
The methodgetJspApplicationContext(ServletContext) is undefined for the type JspFactoryStacktrace:
atorg.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
atorg.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:366)
atorg.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:476)
atorg.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
atorg.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
atorg.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
atorg.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:657)
atorg.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
atorg.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
atorg.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
atjavax.servlet.http.HttpServlet.service(HttpServlet.java:727)
atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
atorg.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
atcom.bjpowernode.drp.util.filter.CharsetEncodingFilter.doFilter(CharsetEncodingFilter.java:40)
atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
atorg.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
atorg.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
atorg.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
atorg.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
atorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
atorg.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
atorg.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
atorg.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
atorg.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
atorg.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
atorg.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2440)
atorg.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2429)
atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
atorg.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
atjava.lang.Thread.run(Thread.java:744)
?
于是僅僅好去網上查資料。有好多人都說是JSP頁面代碼編寫錯誤或者說是Java環境變量沒有配置好導致的。因為我之前JSP頁面能夠正常執行。全部就將這個說法給排除了。
?
?
接著找網上說的是Tomcat文件夾下的conf文件夾里的web.xml文件與項目中的web.xml文件的版本號標識不一樣,于是就將Tomcat里的web.xml文件改成了和項目里的一樣的標識版本號。
就是以下這句話:
<?xmlversion="1.0" encoding="UTF-8"?
> <web-appversion="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name></display-name> </web-app>
?
然后又一次啟動項目的JSP頁面,錯誤繼續存在。于是在網上繼續找,發現網上非常多的人又說是由于項目中有比較低的版本號的jar包導致的:以下是網上的原話。非常多人都允許以下這樣的說法。
?
“catalina.jar、jsp-api.jar、servlet-api.jar、javax.servlet.jar、javax.servlet.jsp.jar等包和應用server(JBoss/Tomcat等)中的包反復且比其版本號低。應用server在啟動時會優先載入項目中的包,這樣就導致和應用server中的其他包不匹配。
可把反復的包從項目中刪除。或將應用server下的這些包復制到項目中,重新啟動服務就可以。”
?
接下來我真的在?javaee Library中發現了javax.servlet.jar 和javax.servlet.jsp.jar jar兩個包
。于是就將它們移除了。當再次啟動JSP頁面時這個問題依舊存在。
?
到這里,好幾個小時都已經過去。心情有點小浮躁了已經。強迫讓自己冷靜下來,好好將這個問題順一順。
?
因為之前JSP頁面能夠正常執行。排除JSP代碼編寫錯誤,唯一做的改變也僅僅是又一次換了一個Tomcat而已,Tomcat換完以后,環境變量也已經配置完畢了。不可能是環境變量的問題。
如今頁面不能正常執行。會不會是因為之前的64位Tomcat的jar包影響了如今32位的Tomcat。于是接下來做了一個試驗,又一次建立一個項目,在里面建立一個新的JSP頁面,能夠正常訪問。
?
最后問題攻克了,解決方法非常搞笑:新建立一個項目,將原來項目的類、配置文件、jsp文件、還有我們自己專門引入的jar包,也就是自己在做項目中加入或引入的文件復制到新建立的項目中。然后執行就成功了,問題就不會再出現了。
?
?
果然是之前的64位Tomcat的jar包影響的。盡管之前的64位的Tomcat早已經移除了,但是之前的64位的Tomcat的一些jar包仍然包括在項目中導致的。
?
盡管過程一波三折。只是終于問題還是攻克了。
?