msT*_*Tam 5 tomcat servlets compiler-errors
我正在尝试从命令行编译和部署一个简单的 Web 应用程序。
来自 Apache Tomcat 的 servlet-api.jar 不编译我的 java 文件,但来自 maven 中央存储库的 javax.servlet-api-4.0.1 编译成功。即便如此,当我部署应用程序并尝试在浏览器中使用它时,我还是收到了错误消息。
我在用:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用 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
Run Code Online (Sandbox Code Playgroud)
但是,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
Run Code Online (Sandbox Code Playgroud)
我尝试将 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)
Run Code Online (Sandbox Code Playgroud)
不确定最后一个是否有意义,但我没有想法了。
任何帮助都非常受欢迎!
当我将.class文件放在对应的Tomcat目录下,启动服务器并尝试与应用程序交互时,出现以下异常:
Run Code Online (Sandbox Code Playgroud)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 个选择:
将javax.servlet.*代码中的导入替换为导入jakarta.servlet.*。
import jakarta.servlet.*;
import jakarta.servlet.http.*;
Run Code Online (Sandbox Code Playgroud)
然后,您可以针对基于 Servlet 5.0 的目标运行时中的库进行编译。
或者,将 servlet 容器从 Servlet API 版本 5.0 降级到以前的版本,至少是仍然具有javax.servlet.*包名称的版本。Tomcat 9.x 是最新的,仍然保留旧包。
技术原因是在从 Java/Jakarta EE 8 到 Jakarta EE 9 的步骤中,所有javax.*包都已重命名为jakarta.*包。因此,自 Jakarta EE 9 以来不再具有向后兼容性。
因此,当javax.servlet.*您在使用 Tomcat 10 或更新版本时遵循任何仍使用旧包的servlet 教程时,您需要手动替换代码示例中使用的包jakarta.servlet.*。一般来说它会工作得很好。
pom.xmlTomcat 10+、Tomcat 9-、JEE 9+ 和 JEE 8-正确声明的完整示例,以防万一使用 Maven)。| 归档时间: |
|
| 查看次数: |
2344 次 |
| 最近记录: |