了解谁提供了servlet-api.jar,它是web容器还是JavaEE下载的一部分

了解谁提供了servlet-api.jar,它是web容器还是JavaEE下载的一部分,java,jakarta-ee,servlets,tomcat7,Java,Jakarta Ee,Servlets,Tomcat7,我需要了解serlvet-api.jar,它是编译servlet所必需的 我正在构建一个简单的servlet,如下所示: import javax.servlet.*; import javax.servlet.http.*; public class FirstServlet extends HttpServlet { // Remaining code here } javac -classpath /path/where/jar/is/servlet-api.jar 我知道我

我需要了解serlvet-api.jar,它是编译servlet所必需的

我正在构建一个简单的servlet,如下所示:

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

public class FirstServlet extends HttpServlet {
    // Remaining code here
}
javac -classpath /path/where/jar/is/servlet-api.jar
我知道我们需要servlet-api.jar文件来编译这个简单的servlet,如下所示:

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

public class FirstServlet extends HttpServlet {
    // Remaining code here
}
javac -classpath /path/where/jar/is/servlet-api.jar
现在我的怀疑从这里开始:

  • 什么是servlet-api.jar
  • 谁提供这个罐子
  • 是否每个web容器都提供这个jar,例如Tomcat、Jboss、glassfish?每个供应商是否为构建这个简单Servlet所需的jar提供了“相同的名称”
  • 当我们下载JavaEE时,这个jar是下载的一部分吗?或者我们是否将此文件作为web容器的一部分获取
  • 考虑这种情况:

    假设我们使用Tomcat编译/构建简单的servlet(即构建servlet所需的Tomcat版本的jar),并创建一个.war文件。然后我们可以在其他供应商容器中部署war吗


  • 这是什么?

    ServletAPI jar是一个库,其中包含ServletAPI规范的接口和类。ServletAPI jar只包含servlet规范的接口(api),因此您可以使用它来开发web应用程序

    在哪里可以买到它?

    可通过以下链接获取:

    包含/捆绑的位置

    Servlet-api.jar是JavaEE下载的一部分,因此您可以开发web应用程序(如果JavaEE不包含您的
    FirstServlet
    类,则无法编译该类)

    Servlet容器(如Tomcat、JBoss、GlassFish等)还包含Servlet-api.jar,否则它们将无法运行web应用程序,而且它们还包含作为Servlet api一部分的接口的实现

    尽管名称并不总是相同的,甚至可能不作为单独的jar存在,但ServletAPI类可能捆绑在另一个jar中

    但是,如果您只想为Servlet容器开发web应用程序,或者如果您想创建/编写自己的Servlet API实现,则可以下载一个单独的jar文件,该文件只包含Servlet API。看看这里:

    可移植性

    如果您有ServletAPI,那么您可以编译web应用程序,无论它来自何处。编译web应用程序后,您可以选择将其打包到WAR文件(WAR=web ARchive)中,该文件只是一个zip文件,包含静态文件、编译的java类和配置文件,如
    web.xml
    等,您将能够在任何Servlet容器中运行编译的web应用程序(但向前读取)

    因此,对你的问题5的回答是:

    ServletAPI有多个版本,JavaEE平台不仅仅是ServletAPI(例如企业JavaBeans)。但是可以肯定地说,如果您只使用ServletAPI,那么实现该版本ServletAPI的所有Servlet容器都将能够运行您的web应用程序


    但是,不同web应用程序的配置文件可能不同(这超出了Servlet API的范围),因此,您应该始终检查目标web应用程序的文档。

    需要提供此servlet api的是服务器容器供应商。您可以在以下目录树C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib中找到它(这取决于您的容器下载位置)。当然,它是由其他容器提供的

    什么是servlet-api.jar

    它是一个jar,提供编写servlet所需的接口/类

    谁提供这个罐子

    任何servlet容器,如Jetty或Tomcat,以及任何符合JavaEE的应用服务器,如JBoss/Wildfly、GlassFish、IBMWebSphere、OracleWebLogic等

    是否每个web容器都提供这个jar,例如Tomcat、Jboss、glassfish?每个供应商是否为构建这个简单Servlet所需的jar提供了“相同的名称”

    ServletAPI是这样的,因为它是一组接口,因此我们可以避免编程到特定的应用服务器。包含实现的jar的名称不能有此名称的公共部分

    当我们下载JavaEE时,这个jar是下载的一部分吗?或者我们是否将此文件作为web容器的一部分获取

    Oracle提供的JavaEE下载只是GlassFish。这已在前面介绍过

    假设我们使用Tomcat编译/构建简单的servlet(即构建servlet所需的Tomcat版本的jar),并创建一个.war文件。然后我们可以在其他供应商容器中部署war吗


    只要您不使用Tomcat特定的类、库或特性,那么是的,就不会有问题。否则,就不会了。

    基于POM文件可以轻松检查很多内容。 例如,有对tomcat servlet api(更新版本的)的引用


    另外请注意,在调查依赖关系树时,它可能会引起一些混乱,因为它根本不使用任何ServletAPI jar,而只是在自身内部指定ServletAPI契约

    谢谢你的回复。如果可能,你能为第5点提供帮助吗?谢谢#5的答案取决于具体情况,不是肯定的。你的答案很好,但你可以添加一个细节:
    servlet api.jar
    只包含api。容器中的JAR包含API和实现类。在容器外运行测试时,您必须注意:您可能需要存根或模拟实现类(例如,从Oracle Glassfish获得一个完整的jar)。感谢您的回复。非常感谢您提供的详细信息,非常感谢。