【问题标题】:@WebServlet fails in Netbeans 11.0 with java.lang.RuntimeException: com.example.NewServlet.<init>(NewServlet.java:1)@WebServlet 在 Netbeans 11.0 中因 java.lang.RuntimeException 失败:com.example.NewServlet.<init>(NewServlet.java:1)
【发布时间】:2019-11-29 07:42:48
【问题描述】:

某种噩梦 - 无法使用 servlet 注释在 Apache Tomcat 9.0.22(或 Glassfish 5.0.1)和 Apache NetBeans IDE 11.0(Build incubator-netbeans-release-404-on-20190319)上启动原始 servlet。 . 使用JDK 1.8u221。代码如下:

@WebServlet(name = "NewServlet", urlPatterns = {"/meow"})
public class NewServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println("test");
    }
}

还有web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<web-app 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">

</web-app>

根本原因(注意行号,总是1!):

java.lang.RuntimeException: 
    com.example.NewServlet.<init>(NewServlet.java:1)
    java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    java.base/java.lang.Class.newInstance(Class.java:584)
    org.apache.openejb.core.WebContext.newWeakableInstance(WebContext.java:147)
    org.apache.openejb.core.WebContext.newInstance(WebContext.java:181)
    org.apache.tomee.catalina.JavaeeInstanceManager.newInstance(JavaeeInstanceManager.java:78)
    org.apache.tomee.catalina.JavaeeInstanceManager.newInstance(JavaeeInstanceManager.java:124)
    org.apache.tomee.catalina.JavaeeInstanceManager.newInstance(JavaeeInstanceManager.java:119)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1839)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:834)

目标是仅通过注释来声明 servlet,例如 @WebServlet(name = "NewServlet", urlPatterns = {"/meow"})

在带有 JDK1.8u221 的 NetBeans 8.2 上测试 - 一切都按预期工作。我怀疑问题出在 Apache NetBeans 11 中,即使项目 JDK 设置为 8(也是源代码/二进制格式)。

【问题讨论】:

    标签: servlets netbeans netbeans-11


    【解决方案1】:

    我今天在使用 OpenJDK 14 的 Netbeans 12.0 中遇到了这个问题。事实证明,通过安装 nb-javac 插件解决了这个问题。

    【讨论】:

    • 这个插件的安装对我使用 Apache Netbeans 12.0、JDK 8 到 GlassFish 5.1.0 和项目的 java 平台确实有效。似乎如果您将 JDK 用作库而不定义环境变量,则似乎需要它,因为我的默认 JDK 是 13。这里是 nb-javac 插件的描述,供想要更准确地说明需求的人使用运行一个 servlet:blogs.apache.org/netbeans/entry/what-s-nb-javac-in
    • 确认 nb-javac 插件也解决了在 64 位 OpenJDK 15.0.2 上运行的 Apache Netbeans 12.3 上使用在 JDK 1.8.0_172 上运行的 Apache 8.5.8 的问题
    【解决方案2】:

    fault 在 Apache NetBeans 11 中。在更高版本(仍然是非官方的)11.1 中,即使没有 web.xml 文件,Servlet 注释也可以正常工作。在 Apache NetBeans IDE 11.1 上使用 Apache Tomcat 9.0.22 和 Glassfish 5.0.1 进行了测试(可下载 from this web page)。

    【讨论】:

    猜你喜欢
    • 2020-06-14
    • 2011-10-24
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多