如何在Eclipse项目中导入javax.servlet/jakarta.servlet API?

我想在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版本,例如apachetomcatOracle GlassFishJBossas/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中执行以下步骤:

  1. 在Eclipse中集成servletcontainer

    a通过服务器查看

    • 打开底部框中的服务器视图

    • 右键单击此处并选择新建>服务器

    • 选择适当的servletcontainer品牌和版本,并浏览向导

    b或通过Eclipse首选项

    • 打开窗口>偏好>服务器>运行时环境

    • 您可以在此处添加、编辑和删除服务器

  2. 将服务器与项目关联

    a在新项目中

    • 打开左侧的项目导航器/资源管理器

    • 右键单击此处并选择新建>项目然后在菜单中Web>动态Web项目

    • 在向导中,将目标运行时设置为集成服务器

    b或,在现有项目中

    • 右键单击项目并选择属性

    • 在目标运行时部分,选择集成服务器

    无论哪种方式,Eclipse都会在构建路径中自动获取servletcontainer的库。通过这种方式,您将能够导入并使用Servlet API

不要随身携带松散的特定于服务器的JAR文件

在任何情况下,您都不需要在项目的构建路径属性中闲逛。最重要的是,决不能手动复制/下载/移动/包含特定于servletcontainer的库,如servlet api.jarjsp api.jarel api.jarj2ee.jarjavaee.jar,等等。这只会带来未来的可移植性、兼容性,类路径和可维护性问题,因为当您的webapp部署到与这些库最初从中获取的版本不同的make/版本的servletcontainer时,它将无法工作

在使用Maven的情况下,您需要绝对确保目标运行时已经提供的特定于servletcontainer的库被标记为<范围>提供&lt/范围&gt。您可以在下面的答案中找到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中时,您可能会遇到这些例外情况:

发表评论