如何在我的 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.jarjsp-api.jarel-api.jarj2ee.jarjavaee.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 等以粗心地尝试修复编译错误时,您可能会遇到这些异常:

java.lang.NullPointerException at org.apache.jsp.index_jsp._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.JasperException: The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory java.lang.VerifyError: (class: org/apache/jasper/runtime/JspApplicationContextImpl, method: createELResolver signature: ()Ljavax/el/ELResolver;) Incompatible argument to function jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

【讨论】:

@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。只需删除 &lt;exclusions&gt;...&lt;/exclusions&gt; 依赖即可解决问题,但确保这样做也会排除嵌入式 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-apitomcat-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.jarjsp-api.jarjavaee.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.jarjsp-api.jarel-api.jar、j2ee.jarjavaee.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 中导入包?

如何在 Eclipse 中导入 RapidMiner JAR?

如何在 Eclipse 中导入 Android Studio 项目?

如何在使用库的eclipse中导入android studio项目?

在 Eclipse 中导入项目的一部分

④---在Eclipse中导入GIT项目