【问题标题】:Deploying WAR file on Apache Tomcat - Not working在 Apache Tomcat 上部署 WAR 文件 - 不工作
【发布时间】:2014-04-19 11:01:45
【问题描述】:

我使用 Eclipse 在 Java 中实现了一个 API,并以 war 文件的形式将其导出。 它在我开发它的系统上运行良好。

这是 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Favorite-API</display-name>
  <servlet>
    <servlet-name>Favorite-API</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>favorite.api</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Favorite-API</servlet-name>
    <url-pattern>/rest-videos/*</url-pattern>
  </servlet-mapping>
</web-app>

现在我想在另一个系统上部署 API。 因此,我按照here 给出的步骤,将war 文件部署到另一台机器的Apache Tomcat 服务器上。

但在运行 API 时出现以下错误:

HTTP Status 500 -   
________________________________


type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: Servlet.init() for servlet Favorite-API threw exception
  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:999)
  org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
  org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
  java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
  java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
  java.lang.Thread.run(Unknown Source)


root cause 

java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
  com.sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.java:79)
  com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:104)
  com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:78)
  com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:89)
  com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:696)
  com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:674)
  com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:205)
  com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:376)
  com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:559)
  javax.servlet.GenericServlet.init(GenericServlet.java:160)
  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:999)
  org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
  org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
  java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
  java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
  java.lang.Thread.run(Unknown Source)


root cause 

java.lang.ClassNotFoundException: org.objectweb.asm.ClassVisitor
  org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
  org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
  com.sun.jersey.api.core.ScanningResourceConfig.init(ScanningResourceConfig.java:79)
  com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:104)
  com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:78)
  com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:89)
  com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:696)
  com.sun.jersey.spi.container.servlet.WebComponent.createResourceConfig(WebComponent.java:674)
  com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:205)
  com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:376)
  com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:559)
  javax.servlet.GenericServlet.init(GenericServlet.java:160)
  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:999)
  org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
  org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
  java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
  java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
  java.lang.Thread.run(Unknown Source)


note The full stack trace of the root cause is available in the Apache Tomcat/7.0.27 logs.

出了什么问题?请帮忙。

【问题讨论】:

  • 某些库似乎丢失了。检查哪个库包含org.objectweb.asm.ClassVisitor 并将其放入您的WEB-INF/lib 文件夹或检查您是否需要org.objectweb.asm.ClassVisitor,即您的自定义代码是否直接依赖于该类或包含它的框架/库?
  • 经典错误:“它可以在我的机器上运行!”
  • @Thomas 所有需要的库都在 WEB-INF/lib 文件夹中。
  • 好吧,看来不是这样。它可能是缺少的传递依赖。 ClassNotFoundException 告诉您容器找不到这些类,我假设 Tomcat 包含应用程序所需的所有库,没有特殊要求。
  • 也可能是版本问题;可能是部署了正确的库(asm),但部署的版本尚未包含所述类。无论如何放开“我做的一切都是正确的”,不,你没有因为缺少所需的课程。找出哪个 jar 包含该类,您就会找出问题所在。

标签: java eclipse apache tomcat war


【解决方案1】:

您的 $TOMCAT_HOME/lib 目录中似乎缺少 ObjectWeb ASM 工件。

【讨论】:

    【解决方案2】:

    貌似tomcat使用没有权限将WAR文件解压到相关目录,也就是说应用本身找不到需要的类。

    确保 Tomcat 可以写入 temp、work 和 webapps 文件夹及其子目录。

    【讨论】:

      【解决方案3】:

      class def not found for servlet 意味着由于某种原因,tomcat 可以定期使用的某些 servlet api 现在丢失了。可能tomcat的lib文件夹中的jar文件(可能是tomcat lib文件夹中的其他jar文件)已损坏或被删除。这两种情况有时都发生在我身上,虚拟机无法运行,磁盘出现故障,或者基于 maven 的构建过程会将额外的 api 部署到 lib 文件夹并在复制新的 lib 文件之前删除其中的内容。

      【讨论】:

        【解决方案4】:

        您的类路径中可能缺少一些依赖项。

        java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
        

        假设您的开发 tomcat 具有此类/包,但不在您尝试部署战争的 tomcat 中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-13
          • 2012-07-29
          • 1970-01-01
          • 2018-03-24
          • 1970-01-01
          • 2015-09-03
          • 1970-01-01
          • 2011-09-02
          相关资源
          最近更新 更多