javax.servlet-api.jar 与 servlet-api.jar 之间的区别

Posted

技术标签:

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

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

【问题讨论】:

你有哪些神器名称? 我有 javax.servlet-api 和 servlet-api。哪个是哪个? 【参考方案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'

【讨论】:

以上是关于javax.servlet-api.jar 与 servlet-api.jar 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

练习日记-1

Maven提供了部署在Juno + Tomcat 7上的范围

正则表达式 (\S+?) 与 (\S+)) [重复]

什么是C/S模式与B/S模式,两者区别与优缺点

Java 中的正则表达式,\\s 与 \\s+

C/S与B/S架构 区别·与优点