2013-03-11 156 views
2

我想在運行Tomcat 7.0.26的Ubuntu服務器(12.04)上部署我的Web應用程序的新版本。我試圖將它們放入/usr/share/tomcat7/lib區域供我計劃部署的其他應用程序使用,而不是包括我使用的傑克遜庫(-core,-annotations-databind)。Tomcat7/Jackson/WebApp部署崩潰/

我可以啓動服務器,並部署我的應用程序。但是,一旦我這樣做,應用程序崩潰,並取消了Tomcat。顯然,ObjectMapper沒有被正確加載,但它在數據綁定jar文件存在(我罐子tvf'd它來檢查)...

到客戶端的響應是:

HTTP Status 500 - 
type Exception report 
message 
description The server encountered an internal error() that prevented it from fulfilling this request. 
exception 
java.lang.NullPointerException 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    java.lang.Thread.run(Thread.java:679) 

而且,catalina.out的日誌文件顯示應用程序後,以下規則執行:

Mar 11, 2013 1:42:55 AM org.apache.coyote.AbstractProtocol pause 
INFO: Pausing ProtocolHandler ["http-bio-8080"] 
Mar 11, 2013 1:42:55 AM org.apache.catalina.core.StandardService stopInternal 
INFO: Stopping service Catalina 
Mar 11, 2013 1:42:57 AM org.apache.coyote.AbstractProtocol stop 
INFO: Stopping ProtocolHandler ["http-bio-8080"] 
Mar 11, 2013 1:42:57 AM org.apache.catalina.loader.WebappClassLoader loadClass 
INFO: Illegal access: this web application instance has been stopped already. Could not load com.fasterxml.jackson.databind.ObjectMapper. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. 
java.lang.IllegalStateException 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546) 
    at org.comtor.authserv.APIServer.doPost(APIServer.java:150) 
    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:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:679) 
Mar 11, 2013 1:42:57 AM org.apache.coyote.AbstractProtocol destroy 
INFO: Destroying ProtocolHandler ["http-bio-8080"] 

這裏任何幫助表示讚賞。我試圖瞭解發生了什麼問題,如何防止它,並防止服務器在執行Web應用程序時發生故障(崩潰)併發生這種情況。

謝謝。

+0

事實上,只有當您的應用程序部署時,其崩潰*纔是可疑的。 WAR中捆綁了哪些庫?如果您使用Maven來管理您的應用程序,請將POM添加到您的問題中,否則請從WEB-INF/lib文件夾中列出JAR。 – Perception 2013-03-11 02:19:49

+0

lib文件夾中沒有包含jar。 (是否需要存在空文件夾?)另外,我沒有使用Maven。我還沒有時間去學習(還)。 – docSquale 2013-03-11 03:25:01

+0

根本沒有JAR?所以你的所有應用程序的代碼都在WEB-INF/classes文件夾中?這聽起來不太可能,除了最瑣碎的網絡應用程序。你在WEB-INF/classes中有任何第三方類嗎? – Perception 2013-03-11 03:34:39

回答

1

我和Jersey REST庫有類似的問題。事實證明,Tomcat崩潰了我的應用程序,因爲我包含在我的WAR文件中的一些jar和我移動到Tomcat的lib文件夾的jar之間存在版本衝突。

我建議您首先在本地開發計算機上解決此問題,因爲它可以更快更輕鬆地移動jar文件。從Tomcat附帶的庫以及所有必需的庫打包到您的war文件中開始。你的應用應該運行良好。然後將jar文件從您的應用程序移動到Tomcat庫。您可以在不重新構建應用的情況下執行此操作。只需使用7-zip等解壓縮工具打開您的war文件,並在將它們移動到Tomcat/lib時從war文件中刪除這些文件。您可能需要每次都重新啓動Tomcat,但我發現通過這種方式獲得工作配置並不需要很長時間。現在我的戰爭檔案只有735KB,而不是8MB,這對我來說很重要,因爲我的上傳速度很慢。

+0

更新:我在我的Mac上安裝了Tomcat7,並用所有庫重新調整了文件。結果完全一樣。 https://gist.github.com/depasqua/5131835 – docSquale 2013-03-11 04:03:45

+0

@docSquale - 看看您的要點,您的網絡應用程序中還捆綁了Jackson JAR。您不能在兩個位置都擁有它們(捆綁在應用程序中,並且還部署在Tomcats庫中)。將它們從WAR中刪除,重新部署並重新測試。 – Perception 2013-03-11 09:04:29

+0

@docSquale如果你剛剛在你的Mac上安裝了Tomcat,那麼它不應該有傑克遜庫,所以我很驚訝你有這個錯誤。你有沒有讓你的應用程序運行?如果是這樣,在什麼環境下運行? Ubunu? – Thorn 2013-03-11 11:09:15