如何在我的 Eclipse 项目中导入 javax.servlet / jakarta.servlet API?
Posted
技术标签:
【中文标题】如何在我的 Eclipse 项目中导入 javax.servlet / jakarta.servlet API?【英文标题】:How do I import the javax.servlet / jakarta.servlet API in my Eclipse project? 【发布时间】:2021-09-22 11:22:51 【问题描述】:我想在 Eclipse 中使用 Servlet 进行开发,但它说无法解析包 javax.servlet
/ jakarta.servlet
。如何将 javax.servlet
/ jakarta.servlet
包添加到我的 Eclipse 项目中?
【问题讨论】:
我正在尝试运行一个简单的 hello word 类型的 servlet,通常如果我想制作一个 gui,我会导入 java......swing.*;我找不到正确的 servlet 导入 【参考方案1】:确保您拥有正确的 Eclipse 和服务器版本
确保您至少使用 Eclipse IDE for Enterprise Java developers(与 Enterprise 一起使用)。它包含用于创建动态 Web 项目和轻松集成 servlet 容器的开发工具(这些工具是 Web 工具平台 WTP 的一部分)。如果您已经拥有 Java 的 Eclipse IDE(没有 Enterprise),并且手动安装了一些相关的插件,那么很可能它没有正确完成。您最好将其丢弃,并获取真正的 Eclipse IDE for Enterprise Java 之一。
您还需要确保您的机器上已经安装了一个 servletcontainer,它至少实现了与生产环境中的 servletcontainer 相同的 Servlet API 版本,例如Apache Tomcat、Oracle GlassFish、JBoss AS/@ 987654325@等。通常只需下载ZIP文件并解压即可。如果是 Tomcat,请不要下载 EXE 格式,这仅适用于基于 Windows 的生产环境。另见 a.o. Several ports (8005, 8080, 8009) required by Tomcat Server at localhost are already in use.
servletcontainer 是 Servlet API 的具体实现。请注意,在 Oracle.com 下载的 Java EE SDK 基本上包含 GlassFish。因此,如果您碰巧已经下载了 Java EE SDK,那么您基本上已经拥有 GlassFish。另请注意,例如 GlassFish 和 JBoss AS/WildFly 不仅仅是一个 servlet 容器,它们还支持 JSF、EJB、JPA 和所有其他 Java EE 特性。另见 a.o. What exactly is Java EE?
确保您使用的是正确的 Servlet 包
javax.*
包已重命名为 jakarta.*
包,因为 Servlet API 5.0 版是 Jakarta EE 9 的一部分(Tomcat 10、TomEE 9、WildFly 22 Preview、GlassFish 6、Payara 6、Liberty 22 等) .因此,如果您的目标是这些服务器版本或更高版本,那么您需要更换
import javax.servlet.*;
import javax.servlet.http.*;
通过
import jakarta.servlet.*;
import jakarta.servlet.http.*;
为了让它编译,否则你可能会面临这个构建错误
在 Java 构建路径中找不到超类“javax.servlet.http.HttpServlet”
在 Eclipse 中集成 Server 并将其与 Project 关联
在您的机器上安装 Eclipse for Enterprise Java 和 servletcontainer 后,在 Eclipse 中执行以下步骤:
在 Eclipse 中集成 servletcontainer
一个。 通过服务器视图
在底部框中打开 Servers 视图。
右键单击那里并选择新建>服务器。
选择适当的 servletcontainer 品牌和版本,然后完成向导。
b. 或者,通过 Eclipse 首选项
打开 Window > Preferences > Server > Runtime Environments。
您可以在此处添加、编辑和删除服务器。
将服务器与项目关联
一个。 在新项目中
打开左侧的Project Navigator/Explorer。
右键单击那里并选择 New > Project,然后在菜单中 Web > Dynamic Web Project。
在向导中,将 Target Runtime 设置为集成服务器。
b. 或者,在现有项目中
右键单击项目并选择属性。
在Targeted Runtimes部分,选择集成服务器。
无论哪种方式,Eclipse 都会自动在构建路径中获取 servletcontainer 的库。这样您就可以导入和使用 Servlet API。
切勿随身携带松散的特定于服务器的 JAR 文件
在任何情况下,您都不需要在项目的 Build Path 属性中摆弄。首先,您应该从不手动复制/下载/移动/包含各个 servletcontainer 特定的库,例如 servlet-api.jar
、jsp-api.jar
、el-api.jar
、j2ee.jar
、javaee.jar
等。只会导致未来的可移植性、兼容性、类路径和可维护性问题,因为当您的 web 应用程序部署到与最初获取这些库的位置不同的 make/version 的 servlet 容器时,您的 web 应用程序将无法工作。
如果您使用的是 Maven,您需要绝对确保目标运行时已经提供的特定于 servletcontainer 的库被标记为<scope>provided</scope>
。您可以在此答案中找到适用于 Tomcat 10+、Tomcat 9-、JEE 9+ 和 JEE 8- 的正确 pom.xml
依赖声明示例:Tomcat 9 casting servlets to javax.servlet.Servlet instead of jakarta.servlet.http.HttpServlet
以下是一些典型的异常,当您使用 servletcontainer 特定的库乱扔 /WEB-INF/lib
甚至 /JRE/lib
、/JRE/lib/ext
等以粗心地尝试修复编译错误时,您可能会遇到这些异常:
【讨论】:
@BalusC 如果我使用 Apache Ant 构建我的项目,如何动态包含 servlet 容器的 /lib(servlet-api.jar & jsp-api.jar) 文件夹?或者我是否需要硬编码 /lib 文件夹的路径,例如 -<property name="tomcat.home" value="D:\\Program Files\\Apache Software Foundation\\apache-tomcat-6.0.36"/>
等
@BalusC 为什么使用原型 maven-archetype-webapp
创建的 maven 项目不包括 servlet-api JAR 作为依赖项?该项目有一个带有编译错误的 index.jsp。 (Eclipse Luna Build id:20140612-0600,JDK 8,M2eclipse)
@arun servlet-api
依赖项由 Tomcat、Wildfly、Glassfish 等 Servlet 运行时环境提供。永远不要将它作为应用程序的一部分,因为它很可能与环境发生冲突。
@BalusC, 1) javax.servlet-api-3.1.0.jar 是否等于 tomcat8/lib/servlet-api.jar?我反编译了这两个 jar,然后发现大多数类/接口是相同的。 2) javax.servlet-api-3.1.0.jar 是容器中性的(不是 servletcontainer 特定的库)吗?
@BalusC,你所说的对我来说是某种抽象。我是 Java 新手。也许我仍然不了解Java的一些概念。所以,你能否给我一个关于我以前的问题的反馈。我想对我的问题进行一些澄清:根据我的想法,JCP(或Oracle)将提供一个仅包含Servlet接口的jar,例如javax.servlet-api-3.1.0.jar的jar。其他供应商想要自己的 Servlet 应该实现接口(另一种选择是他们遵循 JCP 文档,然后给出自己的接口并实现)【参考方案2】:
这也可能是原因。我想出了以下pom.xml
。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
未解决的问题是由于排除了spring-boot-starter-tomcat
。只需删除 <exclusions>...</exclusions>
依赖即可解决问题,但确保这样做也会排除嵌入式 tomcat 服务器。
如果您也需要嵌入式 tomcat 服务器,您可以使用 compile scope
添加相同的依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>compile</scope>
</dependency>
【讨论】:
【参考方案3】:对于 maven 项目,添加以下依赖项:
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
Reference
对于 gradle 项目:
dependencies
providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
或下载javax.servlet.jar
并添加到您的项目中。
【讨论】:
【参考方案4】:我们中的许多人通过 Maven 项目在 Eclipse 中进行开发。如果是这样的话,
您可以通过 tomcat-servlet-api
和 tomcat-jsp-api
jar 在 Maven 中包含 Tomcat 依赖项。每个版本的 Tomcat 都有一个。通常将这些范围 provided
添加到您的 POM 就足够了。这将使您的构建更便携。
如果您以后升级 Tomcat,您只需更新这些 jar 的版本即可。
【讨论】:
【参考方案5】:我知道这是一篇旧帖子。但是,我观察到另一个实例,项目中已经添加了 Tomcat,但我们仍然收到此错误。这样做是为了解决这个问题: Alt + Enter 项目方面 在右侧,详细信息旁边,是另一个选项卡“运行时”。 已安装的 tomcat 服务器将在此处列出。选择它。 保存配置并完成!
希望这对某人有所帮助。
【讨论】:
【参考方案6】:与Hari略有不同:
右击项目--->属性--->Java构建路径--->添加库...--->服务器运行时--->Apache Tomcat---->完成。
【讨论】:
您好 ivanLam,Apache Tomcat 在 Server Runtime 之后没有显示?现在该怎么办!【参考方案7】:在 pom.xml 中添加 javax.servlet 依赖项。您的问题将得到解决。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
【讨论】:
【参考方案8】:就我而言,当我进入 Targetted Runtimes 屏幕时,尽管已安装 Tomcat 7,但并未列出(禁用)。
要修复,我必须转到 Preferences->Server->Runtime Environments,然后卸载并重新安装 Tomcat 7。
【讨论】:
【参考方案9】:从您的服务器 lib 文件夹中包含 servlet-api.jar。
执行此步骤
【讨论】:
解决方案对我不起作用仍然出现以下错误 A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]. StandardHost[localhost].StandardContext[/messenger]]【参考方案10】:您首先应该永远不要手动复制/下载/移动/包含各个 servletcontainer 特定的库,例如 servlet-api.jar
@BalusC,
我更愿意使用我的应用程序将要使用的确切类,而不是 Eclipse 提供的类(当我感觉自己像一个偏执的开发人员时)。
另一种解决方案是使用 Eclipse “配置构建路径”> 库 > 添加外部罐子,并添加任何容器选择使用的 servlet api。
并在使用 ant 构建时遵循 @kaustav datta 的解决方案 - 拥有像 tomcat.home 或 weblogic.home 这样的属性。 然而,它引入了另一个约束,如果正在使用 weblogic,开发人员必须在他/她的本地机器上安装 Weblogic! 还有其他更清洁的解决方案吗?
【讨论】:
【参考方案11】:您可以简单地复制servlet-api.jar
并将该jar 文件复制到lib 文件夹中,该文件夹位于WEB-INF 中。
然后只需清理并构建您的项目,您的错误就会得到解决。
**OR**
您可以使用以下步骤直接将jar文件添加到库中。
-
右键单击项目。
转到属性。
转到 Java 构建路径。
从选项卡中选择添加库选项。
添加 Jar 文件
提供
servlet-api.jar
文件的路径。
清理并构建您的项目。
【讨论】:
拒绝投票,参考上面的 BalusC 帖子和 Aniket Kulkarni 评论,永远不要手动复制/下载/移动/包含各个 servletcontainer 特定的库,如servlet-api.jar
、jsp-api.jar
、javaee.jar
等. 它只会导致未来的可移植性、兼容性、类路径和可维护性问题。【参考方案12】:
第 1 步
转到项目的属性(使用 Alt+Enter 或右键单击)
第 2 步
在Targeted Runtime下检查Apache Tomcat v7.0,它可以工作。
【讨论】:
帮我添加了我的 JBOSS 运行时。我的清单是空的。 这就是我的解决方案。我已将 tomcat 6.0 设置为我的部署环境(作为 eclipse 中的服务器),但忽略了将其指定为我的运行时环境...我猜这意味着它可以在运行时在我的 tomcat/lib 文件夹中找到 .jars,但不是在编译时。 谢谢!但是如何删除 mu 服务器的副本?我有要删除的 Apache Tomcat v7.0 (2) 和 (3)。有人知道怎么做吗? 没有帮助我解决The import javax.servlet cannot be resolved
的问题。
这行得通!谢谢@mrgloom,您可能想删除服务器并在本地主机中创建一个新服务器【参考方案13】:
在创建与“动态 Web 模块”相关的项目期间,我遇到了一个空指针异常。
为了让项目编译(即到javax.servlet
导入成功)我不得不去项目的Properties,在侧边栏中选择Project Facets,勾选Dynamic Web Module并点击Apply。
令人惊讶的是,这一次“动态 Web 模块”方面安装正确,并且导入开始工作。
【讨论】:
【参考方案14】:快速修复 - 这在 Eclipse 中有效 - 右键单击项目 -> 属性 -> Java 构建路径(选项卡) -> 添加外部 JAR -> 找到 servlet api jar 实现(如果 Tomcat - 它命名为 servlet-api.jar ) -> 单击确定。就是这样!!
【讨论】:
参考上面的 BalusC 帖子永远不要手动复制/下载/移动/包含单独的 servletcontainer 特定库,如servlet-api.jar
、jsp-api.jar
、el-api.ja
r、j2ee.jar
、javaee.jar
等。它只会导致未来的可移植性、兼容性、类路径和可维护性问题。【参考方案15】:
来自wikipedia。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorld extends HttpServlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 " +
"Transitional//EN\">\n" +
"<html>\n" +
"<head><title>Hello WWW</title></head>\n" +
"<body>\n" +
"<h1>Hello WWW</h1>\n" +
"</body></html>");
当然,这仅在您将 servlet-api.jar
添加到 Eclipse 构建路径时才有效。通常,您的应用程序服务器(例如 Tomcat)将具有正确的 jar 文件。
【讨论】:
以上是关于如何在我的 Eclipse 项目中导入 javax.servlet / jakarta.servlet API?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Eclipse 中导入 RapidMiner JAR?
如何在 Eclipse 中导入 Android Studio 项目?