Tomcat 8.0.36:WebappClassLoaderBase难以捉摸的nullpointerexception

时间:2016-07-08 10:21:21

标签: java tomcat servlets nullpointerexception tomcat8

问题:

问题是我在Tomcat的NullPointerException中获得WebappClassLoaderBase而没有太多解释为什么会发生这种情况。据我所知,它从版本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>

2 个答案:

答案 0 :(得分:2)

我通过在<servlet-class>文件中添加web.xml标记解决了这个问题。

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

答案 1 :(得分:0)

我在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版本。