我想在Eclipse中使用servlet进行开发,但是它说包javax.servlet/jakarta.servlet无法解析。如何将javax.servlet/jakarta.servlet包添加到Eclipse项目中
确保您拥有正确的Eclipse和服务器版本
确保您至少使用了面向企业Java开发人员的Eclipse IDE(使用企业)。它包含用于创建动态web项目和轻松集成servletcontainers的开发工具(这些工具是web工具平台WTP的一部分)。如果您已经有了EclipseIDEforJava(没有企业版),并且手动安装了一些相关插件,那么很有可能没有正确完成。您最好扔掉它,为EnterpriseJavaOne获取真正的EclipseIDE
您还需要确保您的计算机上已经安装了servletcontainer,它至少实现了与生产环境中的servletcontainer相同的ServletAPI版本,例如apachetomcat,Oracle GlassFish,JBossas/WildFly等。通常,只需下载ZIP文件并将其解压缩即可。对于Tomcat,不要下载EXE格式,这仅适用于基于Windows的生产环境。另请参见a.o.本地主机上Tomcat服务器所需的几个端口(8005、8080、8009)已经在使用中
servletcontainer是ServletAPI的具体实现。请注意,Oracle.com上下载的Java EE SDK基本上包含GlassFish。所以,如果您碰巧已经下载了JavaEESDK,那么您基本上已经有了GlassFish。还要注意,例如GlassFish和JBoss AS/WildFly不仅仅是一个servletcontainer,它们还支持JSF、EJB、JPA和所有其他JavaEE。另请参见a.o.Java EE到底是什么
确保您使用的是正确的Servlet包
javax.*包从Servlet API版本5.0开始被重命名为jakarta.*包,该版本是jakarta EE 9的一部分(Tomcat 10、TomEE 9、WildFly 22 Preview、GlassFish 6、Payara 6、Liberty 22等)。因此,如果您的目标是这些服务器版本或更新版本,那么您需要更换
import javax.servlet.*;
导入javax.servlet.http.*;
借
导入jakarta.servlet.*;
导入jakarta.servlet.http.*;
为了让它编译,否则您可能会面临这个构建错误
“超类”;“javax.servlet.http.HttpServlet”;在Java生成路径上找不到
在Eclipse中集成服务器并将其与项目关联
在您的计算机上安装了Eclipse for Enterprise Java和servletcontainer之后,请在Eclipse中执行以下步骤:
-
在Eclipse中集成servletcontainer
a通过服务器查看
-
打开底部框中的服务器视图
-
右键单击此处并选择新建>;服务器
-
选择适当的servletcontainer品牌和版本,并浏览向导

b或通过Eclipse首选项
-
打开窗口>;偏好>;服务器>;运行时环境
-
您可以在此处添加、编辑和删除服务器

-
-
将服务器与项目关联
a在新项目中
-
打开左侧的项目导航器/资源管理器
-
右键单击此处并选择新建>;项目然后在菜单中Web>;动态Web项目
-
在向导中,将目标运行时设置为集成服务器

b或,在现有项目中
-
右键单击项目并选择属性
-
在目标运行时部分,选择集成服务器

无论哪种方式,Eclipse都会在构建路径中自动获取servletcontainer的库。通过这种方式,您将能够导入并使用Servlet API
-
不要随身携带松散的特定于服务器的JAR文件
在任何情况下,您都不需要在项目的构建路径属性中闲逛。最重要的是,决不能手动复制/下载/移动/包含特定于servletcontainer的库,如servlet api.jar,jsp api.jar,el api.jar,j2ee.jar,javaee.jar,等等。这只会带来未来的可移植性、兼容性,类路径和可维护性问题,因为当您的webapp部署到与这些库最初从中获取的版本不同的make/版本的servletcontainer时,它将无法工作
在使用Maven的情况下,您需要绝对确保目标运行时已经提供的特定于servletcontainer的库被标记为<;范围>;提供</范围>。您可以在下面的答案中找到Tomcat10+、Tomcat9-、JEE9+和JEE8-的适当的pom.xml依赖声明示例:Tomcat 9将servlet转换为javax.servlet.servlet而不是jakarta.servlet.http.HttpServlet
以下是一些典型的例外情况,当您不小心试图修复编译错误而将特定于servletcontainer的库丢弃在/WEB-INF/lib甚至/JRE/lib、/JRE/lib/ext中时,您可能会遇到这些例外情况:
- java.lang.NullPointerException位于org.apache.jsp.index\u jsp.\u jspInit
- java.lang.NoClassDefFoundError:javax/el/ELResolver
- java.lang.NoSuchFieldError:IS_DIR
- java.lang.NoSuchMethodError:javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext
- java.lang.AbstractMethodError:javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext
- org.apache.jasper.jaspereException:类型JspFactory的方法getJspApplicationContext(ServletContext)未定义
- java.lang.VerifyError:(类:org/apache/jasper/runtime/JspApplicationContextImpl,方法:createELResolver签名:()Ljavax/el/ELResolver;)函数的参数不兼容
- jar未加载。参见Servlet规范2.3,第9.7.2节。有问题的类:javax/servlet/servlet.class