我正在尝试从命令行编译和部署一个简单的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);
}
}
当我尝试使用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)
不确定最后一个步骤是否有意义,但我没有任何想法。
任何帮助都超过了欢迎!
当我将.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个选择:
用一个替换javax.servlet.*
代码中的导入jakarta.servlet.*
。
import jakarta.servlet.*;
import jakarta.servlet.http.*;
然后,您可以仅基于基于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起,就不再存在向后兼容性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句