我想在Eclipse中使用servlet进行开发,但它说包javax。Servlet / jakarta。Servlet无法解析。如何添加javax。Servlet / jakarta。servlet包到我的Eclipse项目?


当前回答

假设有一个简单的动态Web项目。确保Tomcat存在于项目的构建路径中。

首先在您的机器上下载/安装本地tomcat实例。假设我们安装了tomcat v8.5。

现在配置Eclipse全局服务器运行时环境

Windows > Preferences > Server > Runtime Environments > Add > Apache > Apache Tomcat v8.5 > Next > Browse Tomcat Installation directory > Next > Finish.

现在创建动态web项目,我们看到导入javax。Servlet无法解决问题。请按照以下步骤解决此问题。

Right Click On Project > Build Path > Configure Build Path > Libraries > Add Library > Server Runtime > Select your Apache Tomcat instance > Finish > Apply and Close.

所有的错误都会消失。

其他回答

这也可能是原因。我已经提出以下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-start -tomcat。只需删除<排除>…</exclusions>依赖它将解决问题,但确保这样做也将排除嵌入式tomcat服务器。

如果你也需要嵌入式tomcat服务器,你可以添加相同的依赖编译范围。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>compile</scope>
</dependency>

我们中的许多人通过Maven项目在Eclipse中进行开发。如果是这样, 你可以通过Tomcat -servlet-api和Tomcat -jsp-api罐子在Maven中包含Tomcat依赖项。每个版本的Tomcat都有一个。通常在POM中添加范围就足够了。这将使您的构建更加可移植。

如果将来升级Tomcat,也只需更新这些jar的版本。

步骤1

转到项目属性(用Alt+Enter或右键单击)

步骤2

在目标运行时下检查Apache Tomcat v7.0,它可以工作。

最重要的是,不要手动复制/下载/移动/包含特定于servletcontainer的单个库,比如servlet-api.jar

@BalusC,

我更愿意使用我的应用程序将要使用的确切类,而不是Eclipse提供的类(当我感觉自己像一个偏执的开发人员时)。

另一个解决方案是使用Eclipse“配置构建路径”>库>添加外部jar,并添加任何容器的servlet api。

并且在使用ant构建时遵循@kaustav datta的解决方案-拥有一个类似tomcat的属性。Home或weblogic.home。 然而,它引入了另一个约束,如果使用Weblogic,开发人员必须在他/她的本地机器上安装Weblogic ! 还有其他更清洁的解决方案吗?

确保您拥有正确的Eclipse和Server版本

确保您至少为企业Java(和Web)开发人员(使用企业版)使用Eclipse IDE。它包含了用于创建动态web项目和轻松集成servlet容器的开发工具(这些工具是web工具平台WTP的一部分)。如果您已经有了用于Java的Eclipse IDE(没有Enterprise),并手动安装了一些相关的插件,那么很可能没有正确地完成。您最好丢弃它,并为Enterprise Java one使用真正的Eclipse IDE。

You also need to ensure that you already have a servletcontainer installed on your machine which implements at least the same Servlet API version as the servletcontainer in the production environment, for example Apache Tomcat, RedHat WildFly, Eclipse GlassFish, etc. Usually, just downloading the ZIP file and extracting it is sufficient. In case of Tomcat, do not download the EXE format, that's only for Windows based production environments. See also a.o. Several ports (8005, 8080, 8009) required by Tomcat Server at localhost are already in use.

Servlet容器是Servlet API的具体实现。还要注意,例如WildFly和GlassFish不仅仅是一个servlet容器,它们还支持JSF (Faces)、EJB (Enterprise Beans)、JPA (Persistence)和所有其他Jakarta EE的功能。请参见a.o。Java EE到底是什么?

确保使用了正确的Servlet包

javax。*包已重命名为jakarta。*从Servlet API 5.0版本开始包,它是Jakarta EE 9的一部分(Tomcat 10, TomEE 9, WildFly 22预览,GlassFish 6, Payara 6, Liberty 22等)。因此,如果您的目标是这些服务器版本或更新版本,则需要进行替换

import javax.servlet.*;
import javax.servlet.http.*;

by

import jakarta.servlet.*;
import jakarta.servlet.http.*;

为了让它编译,否则您可能会面临这个构建错误的风险

超类“javax.servlet.http”。在Java构建路径中找不到HttpServlet

在Eclipse中集成服务器并将其与项目相关联

在您的机器上安装了Eclipse for Enterprise Java和servlet容器之后,在Eclipse中执行以下步骤:

Integrate servletcontainer in Eclipse a. Via Servers view Open the Servers view in the bottom box. Rightclick there and choose New > Server. Pick the appropriate servletcontainer make and version and walk through the wizard. b. Or, via Eclipse preferences Open Window > Preferences > Server > Runtime Environments. You can Add, Edit and Remove servers here. Associate server with project a. In new project Open the Project Navigator/Explorer on the left hand side. Rightclick there and choose New > Project and then in menu Web > Dynamic Web Project. In the wizard, set the Target Runtime to the integrated server. b. Or, in existing project Rightclick project and choose Properties. In Targeted Runtimes section, select the integrated server. Either way, Eclipse will then automatically take the servletcontainer's libraries in the build path. This way you'll be able to import and use the Servlet API.

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

You should in any case not have the need to fiddle around in the Build Path property of the project. You should above all never manually copy/download/move/include the individual servletcontainer-specific libraries like servlet-api.jar, jsp-api.jar, el-api.jar, j2ee.jar, javaee.jar, etc. It would only lead to future portability, compatibility, classpath and maintainability troubles, because your webapp would not work when it's deployed to a servletcontainer of a different make/version than where those libraries are originally obtained from.

在使用Maven的情况下,需要绝对确保已经由目标运行时提供的特定于servletcontainer的库被标记为<scope>provided</scope>。你可以在这个回答中找到Tomcat 10+、Tomcat 9-、JEE 9+和JEE 8-的正确pom.xml依赖声明的例子:如何在Maven pom.xml中为Tomcat正确配置Jakarta EE库?

以下是一些典型的异常,当你在/WEB-INF/lib甚至/JRE/lib, /JRE/lib/ext等特定于servletcontainer的库中粗心地试图修复编译错误时,你会得到:

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