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


320

我想在Eclipse中使用Servlet进行开发,但是它说该软件包javax.servlet无法解析。如何将javax.servlet软件包添加到Eclipse项目中?


我试图运行一个简单的hello word类型的servlet,通常如果我想制作一个gui,我将导入java ...... swing。*; 我找不到适合servlet的导入
tom 2010年

Answers:


415

确保您使用了正确的Eclipse和Server

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

您还需要确保机器上已经安装了servletcontainer,该servletcontainer至少实现了与生产环境中的servletcontainer相同的Servlet API版本,例如Apache TomcatOracle GlassFishJBoss AS / WildFly等。通常,仅下载ZIP文件并解压缩就足够了。在Tomcat的情况下,也不能下载EXE格式,这只是基于Windows的生产环境。另请参见Tomcat服务器在localhost所需的几个端口(8005、8080、8009)已在使用中

Servlet容器是Servlet API的具体实现。请注意,从Oracle.com下载的Java EE SDK基本上包含GlassFish。因此,如果您碰巧已经下载了Java EE SDK,那么您基本上已经有了GlassFish。另外请注意,例如GlassFish和JBoss的AS / WildFly是不仅仅是一个servletcontainer,他们也支持JSF,EJB,JPA和所有其他Java EE的空想。另请参见ao Java EE到底是什么?


在Eclipse中集成Server并将其与Project关联

在机器上安装了Eclipse for Enterprise Java和servletcontainer之后,请在Eclipse中执行以下步骤:

  1. 在Eclipse中集成servletcontainer

    一个。通过服务器视图

    • 在底部框中打开“ 服务器”视图。
    • 右键单击那里,然后选择“ 新建”>“服务器”
    • 选择适当的servlet容器品牌和版本,并逐步完成向导。

      在此处输入图片说明

    b。或者,通过Eclipse首选项

    • 打开窗口>首选项>服务器>运行时环境
    • 您可以在此处添加编辑删除服务器。

      在此处输入图片说明

  2. 将服务器与项目关联

    一个。在新项目中

    • 打开左侧的Project Navigator / Explorer
    • 右键单击那里,然后选择“ 新建”>“项目”,然后在菜单中选择“ Web”>“ Dynamic Web Project”
    • 在向导中,将目标运行时设置为集成服务器。

      在此处输入图片说明

    b。或者,在现有项目中

    • 右键单击项目,然后选择“ 属性”
    • 在“ 目标运行时”部分中,选择集成服务器。

      在此处输入图片说明

    无论哪种方式,Eclipse都将自动在构建路径中使用servlet容器的库。这样,您将能够导入和使用Servlet API。


切勿随身携带服务器特定的松散JAR文件

无论如何,您都无需在项目的“ 构建路径”属性中随意摆弄。你应该首先从不手动复制/下载/移动/包括个人servletcontainer专用库喜欢servlet-api.jarjsp-api.jarel-api.jarj2ee.jarjavaee.jar,等它只会导致未来的可移植性,兼容性,类路径和可维护性的烦恼,因为你的web应用程序会当它是不工作部署到与最初从那些库获取版本/版本不同的servlet /版本的servlet容器中。

如果您使用的是Maven,则需要绝对确保目标运行时已提供的servlet容器特定的库被标记为<scope>provided</scope>

下面是一些典型的例外,你可以当你的垃圾/WEB-INF/lib,甚至/JRE/lib/JRE/lib/ext等在一个不小心尝试修复编译错误servletcontainer专用库:


4
@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"/>
kaustav达塔

1
@BalusC为什么使用原型创建的Maven项目maven-archetype-webapp不包括servlet-api JAR作为依赖项?该项目具有带有编译错误的index.jsp。(Eclipse的露娜版本ID:20140612-0600,JDK 8,m2eclipse的)
阿伦

1
servlet-apiServlet运行时环境(例如Tomcat,Wildfly,Glassfish等)提供@arun 依赖项。永远不要将其包含在您的应用程序中,因为它很可能与环境冲突。
ass 2015年

@BalusC,1)javax.servlet-api-3.1.0.jar是否等于tomcat8 / lib / servlet-api.jar?我反编译了两个jar,然后发现类/接口的相同。2)javax.servlet-api-3.1.0.jar容器是中立的(不是servlet容器特定的库)吗?
gfan

@gfan:技术问题不是容器提供的库是否“容器中立”,而是类加载的优先级和顺序。如果容器提供的库由错误的类加载器加载(例如通过webapp类加载器),则即使“巧合”完全相同的版本,也可能会造成破坏。只是不要从容器外部的重复位置提供容器提供的库。期。
BalusC

220

导入javax.servlet

步骤1

转到项目的属性(使用Alt+ Enter或righ-click)

第2步

检查“ 目标运行时”下的Apache Tomcat v7.0,它是否有效。


2
帮助我添加了JBOSS运行时。我的名单是空的。
2014年

2
这是我的解决方案。我已经将tomcat 6.0设置为我的部署环境(作为eclipse中的服务器),但是忽略了将其指定为我的运行时环境...我猜测这意味着它可以在运行时在tomcat / lib文件夹中找到.jars,但不是在编译时。
2014年

谢谢!但是,如何删除亩服务器的副本?我有要删除的Apache Tomcat v7.0(2)和(3)。有人知道吗?
罗本

没有帮助我解决问题The import javax.servlet cannot be resolved
mrgloom

1
这可行!谢谢@mrgloom,您可能想要删除服务器并在本地主机中创建一个新服务器
Freddie Fabregas

81

与Hari有点不同:

右键单击项目--->属性---> Java构建路径--->添加库... --->服务器运行时---> Apache Tomcat ---->完成。


3
嗨,ivanLam,服务器运行后没有显示Apache Tomcat吗?现在做什么!
Sandeep Pattanaik 2015年

15

从服务器lib文件夹中包含servlet-api.jar。在此处输入图片说明

做这个步骤

在此处输入图片说明


1
解决方案对我不起作用,仍然出现以下错误启动启动期间子容器失败java.util.concurrent.ExecutionException:org.apache.catalina.LifecycleException:无法启动组件[StandardEngine [Catalina] .StandardHost [localhost] .StandardContext [/信使]]
玛雅人Mohite,2017年

13

在pom.xml中添加javax.servlet依赖项。您的问题将得到解决。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

12

快速修复-在Eclipse中有效-右键单击项目->属性-> Java构建路径(Tab)->添加外部JAR->找到servlet api jar实现(如果Tomcat-其名为servlet-api.jar)->单击确定。而已 !!


14
参照上述BalusC后从未手动复制/下载/移动/包括像个人servletcontainer专用库servlet-api.jarjsp-api.jarel-api.jaR, ,j2ee.jarjavaee.jar等它只会导致未来的可移植性,兼容性,类路径和可维护性的烦恼。
Aniket Kulkarni

5

您可以简单地复制servlet-api.jar和将jar文件复制到WEB-INF中的lib文件夹中。然后只需清理并构建您的项目,即可解决您的错误。

  **OR**

您可以按照以下步骤将jar文件直接添加到库中。

  1. 右键单击项目。
  2. 转到属性。
  3. 转到Java构建路径。
  4. 从选项卡中选择添加库选项。
  5. 添加jar文件
  6. 给出servlet-api.jar文件的路径。
  7. 清理并构建您的项目。

Downvoting,参照上述BalusC后和Aniket库卡尼评论,从来没有手动复制/下载/移动/包括像个人servletcontainer专用库servlet-api.jarjsp-api.jarjavaee.jar,等它只会导致未来的可移植性,兼容性,类路径和可维护性的烦恼。
el-teedee

5

我知道这是旧帖子。但是,我观察到另一个实例,该实例在项目中已经添加了Tomcat,但仍然出现此错误。这样做是为了解决该问题:
Alt + 输入
项目构面
在右侧,详细信息旁边是另一个选项卡“运行时”。已安装的tomcat服务器将在此处列出。选择它。
保存配置并完成!

希望这对某人有帮助。


3

来自维基百科

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构建路径添加到Eclipse时,此方法才有效。通常,您的应用程序服务器(例如Tomcat)将具有正确的jar文件。


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>

参考

对于gradle项目:

dependencies {
providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
}

或下载javax.servlet.jar并添加到您的项目中。


2

在与“动态Web模块”相关的项目创建过程中,我得到了空指针异常。

为了使项目得以编译(即javax.servlet成功导入),我必须转到项目的“ 属性”,在边栏中选择“ Project Facets ”,勾选“ Dynamic Web Module”,然后单击“ Apply”。

令人惊讶的是,这次“ Dynamic Web Module”构面已正确安装,并且导入开始起作用。


2

就我而言,当我进入Targeted Runtimes屏幕时,尽管已安装Tomcat 7,但未列出(禁用)。

要解决此问题,我必须转到“首选项”->“服务器”->“运行时环境”,然后卸载并重新安装Tomcat 7。


2

我们许多人通过Maven项目在Eclipse中进行开发。如果是这样,您可以通过tomcat-servlet-apitomcat-jsp-apijar 将Tomcat依赖项包含在Maven中。每个版本的Tomcat都有一个。通常将这些与作用域添加provided到您的POM中就足够了。这将使您的构建更加便携。

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


0

首先,您绝不应该手动复制/下载/移动/包含各个servlet容器特定的库,例如servlet-api.jar。

@BalusC,

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

另一种解决方案是使用Eclipse“配置构建路径”>“库”>“添加外部Jars”,并添加选择使用的任何Container的servlet API。

并在使用ant进行构建时遵循@kaustav datta的解决方案-具有tomcat.home或weblogic.home之类的属性。但是,这引入了另一个限制,即如果使用weblogic,则开发人员必须在其本地计算机上安装Weblogic!还有其他更清洁的解决方案吗?


0

这也可能是原因。我提出了以下建议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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.