Servlet 5.0 JAR在javax.servlet。*上引发编译错误,但Servlet 4.0 JAR不会

统计

我正在尝试从命令行编译和部署一个简单的Web应用程序。

来自Apache Tomcat的servlet-api.jar不能编译我的java文件,但是来自maven中央存储库的javax.servlet-api-4.0.1可以成功编译它。即使这样,在部署应用程序并尝试在浏览器中使用它时也会出现错误。

我在用:

  • javac 11.0.8
  • Apache Tomcat 10.0(servlet-api.jar 5.0)

Java文件:

package com.example.controllers;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class BeerSelect extends HttpServlet {
    
    public void doPost(HttpServletRequest request,
            HttpServletResponse response)
            throws IOException, ServletException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("Beer Selection Advice <br>");
        String c = request.getParameter("color");
        out.println("<br>Got beer color " + c);
    }               
} 

当我尝试使用servlet-api.jar进行编译时,我得到:

public class BeerSelect extends HttpServlet {
                                ^
  symbol: class HttpServlet
src\com\example\controllers\BeerSelect.java:9: error: cannot find symbol
        public void doPost(HttpServletRequest request,
                           ^
  symbol:   class HttpServletRequest
  location: class BeerSelect
src\com\example\controllers\BeerSelect.java:10: error: cannot find symbol
                        HttpServletResponse response)
                        ^
  symbol:   class HttpServletResponse
  location: class BeerSelect
src\com\example\controllers\BeerSelect.java:11: error: cannot find symbol
                        throws IOException, ServletException {
                                            ^
  symbol:   class ServletException
  location: class BeerSelect
src\com\example\controllers\BeerSelect.java:3: error: package javax.servlet does not exist
import javax.servlet.*;
^
src\com\example\controllers\BeerSelect.java:4: error: package javax.servlet.http does not exist
import javax.servlet.http.*;
^
6 errors 

但是,javax.servlet-api-4.0.1成功编译了文件。注意:我已经测试并排除了命令行命令是导致此问题的可能原因。

当我将.class文件放在相应的Tomcat目录中,启动服务器并尝试与该应用进行交互时,出现以下异常:

Exception
jakarta.servlet.ServletException: Error instantiating servlet class [com.example.controllers.BeerSelect]

Root Cause
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet

Root Cause
java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet

我尝试将javax.servlet-api-4.0.1放置在Tomcat / lib目录中,但随后得到:

Exception
jakarta.servlet.ServletException: Class [com.example.controllers.BeerSelect] is not a Servlet

Root Cause
java.lang.ClassCastException: class com.example.controllers.BeerSelect cannot be cast to class jakarta.servlet.Servlet (com.example.controllers.BeerSelect is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @7862f56; jakarta.servlet.Servlet is in unnamed module of loader java.net.URLClassLoader @4b4523f8)

不确定最后一个步骤是否有意义,但我没有任何想法。

任何帮助都超过了欢迎!

BalusC

当我将.class文件放在相应的Tomcat目录中,启动服务器并尝试与该应用进行交互时,出现以下异常:

java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet

jakarta.servlet.Servlet是Servlet API版本5.0的一部分,而后者又是Jakarta EE版本9的一部分。您的Servlet实际上是从中扩展的,javax.servlet.Servlet而它又是旧的JEE版本的一部分,而目标运行时实际上不支持它(Tomcat 10.x) 。

您有2个选择:

  1. 用一个替换javax.servlet.*代码中导入jakarta.servlet.*

    import jakarta.servlet.*;
    import jakarta.servlet.http.*;
    

    然后,您可以仅基于基于Servlet 5.0的目标运行时对库进行编译。

  2. 或者,将Servlet容器从Servlet API版本5.0降级到以前的版本,至少一个仍具有javax.servlet.*包名称的版本。Tomcat 9.x是最新版本,但仍具有旧软件包。

技术原因是在从Java / Jakarta EE 8到Jakarta EE 9的步骤中,所有javax.*软件包都已重命名为jakarta.*软件包。因此,自Jakarta EE 9起,就不再存在向后兼容性。

也可以看看:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

javax.servlet-api.jar与servlet-api.jar之间的区别

来自分类Dev

从servlet读取jar输出

来自分类Dev

编译错误:包javax.servlet.jsp不存在

来自分类Dev

旧servlet-api-2.3.jar上的HttpServletRequest注销

来自分类Dev

来自库 jar (Jetty) 的 Servlet Web 资源

来自分类Dev

Tkinter错误的#坐标:预期0或4,得到5

来自分类Dev

jsp不会去servlet

来自分类Dev

Servlet不会运行方法

来自分类Dev

java.lang.ClassFormatError:JVMCFRE074没有指定代码属性;class = javax / servlet / http / HttpServlet,method = <init>()V,pc = 0?

来自分类Dev

javax.servlet.ServletException:无法找到具有[0]参数的方法xyz-值表达式与方法表达式

来自分类Dev

如何通过servlet提交WordCount.jar到hadoop

来自分类Dev

编译Servlet错误

来自分类Dev

编译servlet中的错误

来自分类Dev

消息响应发生错误代码为0xC0C01B4C和0xc0c016b5的僵尸

来自分类Dev

servlet-api-2.5 jar在部署war文件时导致错误

来自分类Dev

GWT + Glassfish 4:RPC Servlet错误404

来自分类Dev

Jar打印转换并打印“ $?” 到0

来自分类Dev

为什么 int arr[]={0,3,2,4,5,6,7}; 给出错误和 int arr[7]={0,3,2,4,5,6,7}; 不是

来自分类Dev

Tomcat:“违规类:javax / servlet / Servlet.class”,然后超时

来自分类Dev

无法将RepositoryRestMvcConfiguration强制转换为javax.servlet.Servlet

来自分类Dev

测试的JUnit 4下运行,但不JUnit的5 - 编译干净,但0测试执行

来自分类Dev

Spring mvc 4 hello world 示例抛出 javax.servlet.ServletException:无法实例化 WebApplicationInitializer 类

来自分类Dev

SAP BO CMC-CMC上的Information Steward链接错误(SBOP BI 4.1 sp5和SBO EIM 4.2 sp3):Servlet执行引发异常

来自分类Dev

javax.servlet.http.HttpServletRequest.getParts()Ljava / util / Collection错误

来自分类Dev

Servlet类com.foobar.jaxrs.application.MyApplication不是javax.servlet.Servlet

来自分类Dev

org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher无法转换为javax.servlet.Servlet

来自分类Dev

javax.servlet.ServletException:类[org.glassfish.jersey.servlet.ServletContainer]不是Servlet

来自分类Dev

新的servlet抛出javax.servlet.ServletException:包装器找不到servlet类

来自分类Dev

java.lang.ClassCastException:Servlet.Telnet无法转换为javax.servlet.Servlet

Related 相关文章

  1. 1

    javax.servlet-api.jar与servlet-api.jar之间的区别

  2. 2

    从servlet读取jar输出

  3. 3

    编译错误:包javax.servlet.jsp不存在

  4. 4

    旧servlet-api-2.3.jar上的HttpServletRequest注销

  5. 5

    来自库 jar (Jetty) 的 Servlet Web 资源

  6. 6

    Tkinter错误的#坐标:预期0或4,得到5

  7. 7

    jsp不会去servlet

  8. 8

    Servlet不会运行方法

  9. 9

    java.lang.ClassFormatError:JVMCFRE074没有指定代码属性;class = javax / servlet / http / HttpServlet,method = <init>()V,pc = 0?

  10. 10

    javax.servlet.ServletException:无法找到具有[0]参数的方法xyz-值表达式与方法表达式

  11. 11

    如何通过servlet提交WordCount.jar到hadoop

  12. 12

    编译Servlet错误

  13. 13

    编译servlet中的错误

  14. 14

    消息响应发生错误代码为0xC0C01B4C和0xc0c016b5的僵尸

  15. 15

    servlet-api-2.5 jar在部署war文件时导致错误

  16. 16

    GWT + Glassfish 4:RPC Servlet错误404

  17. 17

    Jar打印转换并打印“ $?” 到0

  18. 18

    为什么 int arr[]={0,3,2,4,5,6,7}; 给出错误和 int arr[7]={0,3,2,4,5,6,7}; 不是

  19. 19

    Tomcat:“违规类:javax / servlet / Servlet.class”,然后超时

  20. 20

    无法将RepositoryRestMvcConfiguration强制转换为javax.servlet.Servlet

  21. 21

    测试的JUnit 4下运行,但不JUnit的5 - 编译干净,但0测试执行

  22. 22

    Spring mvc 4 hello world 示例抛出 javax.servlet.ServletException:无法实例化 WebApplicationInitializer 类

  23. 23

    SAP BO CMC-CMC上的Information Steward链接错误(SBOP BI 4.1 sp5和SBO EIM 4.2 sp3):Servlet执行引发异常

  24. 24

    javax.servlet.http.HttpServletRequest.getParts()Ljava / util / Collection错误

  25. 25

    Servlet类com.foobar.jaxrs.application.MyApplication不是javax.servlet.Servlet

  26. 26

    org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher无法转换为javax.servlet.Servlet

  27. 27

    javax.servlet.ServletException:类[org.glassfish.jersey.servlet.ServletContainer]不是Servlet

  28. 28

    新的servlet抛出javax.servlet.ServletException:包装器找不到servlet类

  29. 29

    java.lang.ClassCastException:Servlet.Telnet无法转换为javax.servlet.Servlet

热门标签

归档