【问题标题】:Tomcat7/Jackson/WebApp deployment crash/Tomcat7/Jackson/WebApp部署崩溃/
【发布时间】:2013-03-11 01:59:40
【问题描述】:

我正在尝试在运行 Tomcat 7.0.26 的 Ubuntu 服务器 (12.04) 上部署我的 Web 应用程序的新版本。我没有包含我使用的 jackson- 库(-core-annotations-databind),而是尝试将它们放在 /usr/share/tomcat7/lib 区域中,以供我计划部署的其他应用程序使用。

我可以启动服务器并部署我的应用程序。但是,一旦我这样做,应用程序就会崩溃并关闭 Tomcat。显然 ObjectMapper 没有正确加载,但它存在于数据绑定 jar 文件中(我已经 jar tvf 对其进行检查)...

给客户端的响应是:

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 应用程序并发生这种情况时防止服务器宕机(崩溃)。

谢谢。

【问题讨论】:

  • 在部署您的应用时它崩溃的事实令人怀疑。您的 WAR 中捆绑了哪些库?如果您使用 Maven 管理您的应用程序,请将 POM 添加到您的问题中,否则请从 WEB-INF/lib 文件夹中列出 JAR。
  • lib 文件夹中没有包含 jar。 (是否需要存在一个空文件夹?)另外,我没有使用 Maven。我还没有时间学习(还)。
  • 根本没有 JAR?所以你所有的应用程序代码都在 WEB-INF/classes 文件夹中?除了最微不足道的网络应用程序之外,这听起来不太可能。 WEB-INF/classes 中有第三方类吗?
  • 为了方便起见,我试图将所有第三方 jar 放入 TOMCAT 库中,这样当我更改应用程序时,我不需要创建一个大的战争文件。此外,整个应用程序的一些核心底层功能在它自己的 jar 中,也在 lib 中。然后,webapp 只是创建 web 服务的代码,该服务反过来调用 3rd 方库和我的库。

标签: java tomcat jackson


【解决方案1】:

我对 Jersey REST 库也有类似的问题。事实证明,Tomcat 正在使我的应用程序崩溃,因为我包含在我的 WAR 文件中的一些 jar 与我移动到 Tomcat 的 lib 文件夹的 jar 之间存在版本冲突。

我建议您首先在本地开发机器上解决此问题,因为移动 jar 文件更快更容易。从 Tomcat 附带的库开始,并将所有需要的库打包到您的 war 文件中。您的应用程序应该可以正常运行。然后将 jar 文件从您的应用程序移动到 Tomcat 库。您可以在不重新构建应用程序的情况下执行此操作。只需使用 7-zip 之类的解压缩实用程序打开您的 war 文件,然后在将它们移动到 Tomcat/lib 时从您的 war 文件中删除这些文件。您可能每次都需要重新启动 Tomcat,但我发现以这种方式获得工作配置并不需要很长时间。现在我的 war 文件只有 735KB 而不是 8MB,这对我来说很重要,因为我的上传速度很慢。

【讨论】:

  • 更新:我在我的 Mac 上安装了 Tomcat7 并用所有库重新编译了文件。结果是完全一样的。 gist.github.com/depasqua/5131835
  • @docSquale - 查看您的要点,您的 Web 应用程序中仍然捆绑了 Jackson JAR。您不能在两个位置都拥有它们(捆绑在应用程序内,也部署在 Tomcats 库中)。从 WAR 中删除它们,重新部署并重新测试。
  • @docSquale 如果你刚刚在你的 Mac 上安装了 Tomcat,那么它不应该有 jackson 库,所以我很惊讶你有这个错误。你有没有让你的应用程序运行?如果是这样,它是在什么环境下运行的?乌布努?
  • Tomcat 已安装在我的本地计算机 (Mac) 上(作为您上面建议的测试)。我没有看到随 Tomcat 一起安装的 jackson 库,也不熟悉 Mac 上可能安装的其他内容。但是,我似乎已经将问题归结为我的代码(线程)抛出了中断的异常并且线程正在死亡。 ObjectMapper 加载是在线程使用之后进行的,看起来这是一个残留的副作用。在我想到重构代码并将一些代码放入它自己的库之前,这一切都很好。
  • 看起来您的问题不在于库位置,而在于您可能已经完成了其他重构。 Mac 或 Ubuntu 无关紧要。我认为无论您将其放置在哪个平台上,基本的 Tomcat 安装都带有相同的库。
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 2013-09-27
  • 2013-11-20
  • 1970-01-01
  • 2011-11-22
  • 2015-07-10
  • 2016-03-06
  • 1970-01-01
相关资源
最近更新 更多