【问题标题】:Difference between javax.servlet-api.jar vs servlet-api.jarjavax.servlet-api.jar 与 servlet-api.jar 之间的区别
【发布时间】:2016-03-24 18:35:48
【问题描述】:

在 groupId javax.servlet 下的 maven 存储库中,我有这两个单独的 servlet 工件。我很困惑我应该使用哪一个来构建一个简单的 servlet 应用程序?这两个神器有什么区别?

【问题讨论】:

  • 你有哪些神器名称?
  • 我有 javax.servlet-api 和 servlet-api。哪个是哪个?

标签: java maven servlets artifacts


【解决方案1】:

javax.servlet-api 3.0.1 版具有注释文件夹,其中包含不同的注释类,其中 servlet-api 2.5 或更低版本(即 2.4 版)不包含注释。

注解代表元数据。如果您使用注释,则不需要部署描述符,即 web.xml。例如,如果您在 servlet 文件中使用 @WebServlet("/hello") 之类的注解,则无需在 web.xml 文件中提及 servlet 映射。

一些有用的注释是:

@HandlesTypes
@HttpConstraint 
@HttpMethodConstraint
@MultipartConfig
@ServletSecurity
@WebFilter
@WebInitParam
@WebListener
@WebServlet

【讨论】:

    【解决方案2】:

    你需要添加

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

    到您的项目。您需要的版本可能会有所不同 - 这取决于您的 servlet 容器,例如雄猫。

    &lt;scope&gt;provided&lt;/scope&gt; 因为您在运行时不需要它,它已经在您的 servlet 容器中。

    【讨论】:

    • 所以你的意思是 javax.servlet 的目的只是为了我的开发?是不是类似于 javax.servlet-api 和 servlet-api 的 jdk 和 jre 类比?
    • 是的,它仅用于开发,因此您的代码可以成功编译。在运行时,您的 servlet 容器将提供必要的功能。
    • 您还没有说出它们之间的区别以及为什么要使用其中一个:(
    • 问题是“这两个工件有什么区别?”
    【解决方案3】:

    使用 javax.servlet-api.jar ,许多开发人员错误地将 servlet-api.jar 包含在他们的 WEB-INF/lib 文件夹中。这不再导致异常,因为 Tomcat 和其他应用服务器在部署 JAR 文件时会将其识别为问题。但是,它确实会导致容器忽略任何包含 javax/servlet/Servlet.class 的 JAR 文件。

    【讨论】:

      【解决方案4】:

      如果您必须在不支持 servlet 3.0 规范(希望不太可能)的旧应用服务器版本上进行部署,请坚持使用旧的 servlet-api。

      使用 3.0 规范,他们将其移至 javax.servlet-api。见:https://javaee.github.io/servlet-spec/

      现在,随着 Java EE 从 Oracle 转移到 Eclipse Foundation (Jakarta EE),规范再次转移。如果您想保持最新状态,可能需要考虑使用新组和工件:jakarta.servlet:jakarta.servlet-api

      https://github.com/eclipse-ee4j/servlet-api

      【讨论】:

        【解决方案5】:

        对于那些使用 gradle...

        如果我使用compileOnly 声明我的依赖项,如下所示

        compileOnly "javax.servlet:javax.servlet-api:3.1.0"
        

        然后我得到一个编译错误:

        error: package javax.servlet.http does not exist
        import javax.servlet.http.HttpServletRequest;
                                 ^
        

        如果我使用providedCompile 如下所示,则构建成功。

        providedCompile "javax.servlet:javax.servlet-api:3.1.0"
        

        要使用 providedCompile 依赖项,您需要使用 war 插件。

        apply plugin: 'war'
        

        【讨论】:

          猜你喜欢
          • 2011-02-20
          • 2021-07-31
          • 2012-01-04
          • 2012-01-10
          • 1970-01-01
          • 2012-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多