【问题标题】:Tomcat 8.0.36: WebappClassLoaderBase elusive nullpointerexceptionTomcat 8.0.36:WebappClassLoaderBase 难以捉摸的空指针异常
【发布时间】:2016-07-08 10:21:20
【问题描述】:

问题:

问题是我在 Tomcat 中的WebappClassLoaderBase 中得到了一个NullPointerException,而没有太多解释为什么会发生这种情况。据我所知,它从 8.0.35 版本开始发生.....

异常跟踪:

java.lang.NullPointerException
    org.apache.catalina.loader.WebappClassLoaderBase.binaryNameToPath(WebappClassLoaderBase.java:2562)
    org.apache.catalina.loader.WebappClassLoaderBase.findLoadedClass0(WebappClassLoaderBase.java:2730)
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1208)
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1166)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2508)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2497)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:745)

产生问题的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"
    version="3.0">

<servlet>
    <servlet-name>FirstServlet</servlet-name>
    <async-supported>true</async-supported>
</servlet>

<servlet>
    <servlet-name>SecondServlet</servlet-name>
    <enabled>false</enabled>
</servlet>

<session-config>
    <session-timeout>7</session-timeout>
    <cookie-config>
        <http-only>true</http-only>
        <secure>true</secure>
    </cookie-config>
</session-config>

<security-constraint>
    <display-name>HTTPS</display-name>
    <web-resource-collection>
        <web-resource-name>HTTPS Constraint</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<!-- IMPORTED web.xml MODULES END -->

</web-app>

【问题讨论】:

    标签: java tomcat servlets nullpointerexception tomcat8


    【解决方案1】:

    我通过在web.xml 文件中添加&lt;servlet-class&gt; 标签解决了这个问题。

    AFAICT 我不需要这样做,因为在我的代码中我有 @WebServlet 注释,应该已经用 Tomcat 注册了类名。

    【讨论】:

      【解决方案2】:

      我在 Debian Wheezy Linux、Java 8、Jersey 2.24、Tomcat 8.0.38 上开发时看到了这个问题,并尝试在我的开发人员文件中将 war 文件部署到 Tomcat 8.0,该文件默认使用操作系统中的 Java 7 .我为开发安装了多个版本的 Java。为了解决这个问题,我创建了一个简短的脚本来将 JAVA_HOME 和 JRE_HOME 变量导出为相应的 Java 8 位置,然后按顺序运行 Tomcat bin/shutdown.sh 和 bin/startup.sh。这样就解决了问题。

      如果将应用程序部署到运行中的 Tomcat,则可以编辑 /etc/default/tomcat8 文件以设置 JAVA_HOME,因为操作系统上的默认值可能是错误的版本。

      假设 Tomcat 会在系统上找到正确的 Java 版本,请务必小心。

      【讨论】:

        猜你喜欢
        • 2014-12-02
        • 2010-12-21
        • 1970-01-01
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        相关资源
        最近更新 更多