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

Difference between javax.servlet-api.jar vs servlet-api.jar

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

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

的 JAR 文件

您需要添加

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

到您的项目。您需要的版本可能不同——这取决于您的 servlet 容器,例如Tomcat。

<scope>provided</scope> 因为你在运行时不需要它,它已经在你的 servlet 容器中了。

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

对于那些使用 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'

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

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

现在,随着 Java EE 从 Oracle 转移到 Eclipse Foundation (Jakarta EE),规范再次转移。如果可能的话,如果你想留下来,你可能会考虑使用新的组和工件 up-to-date: jakarta.servlet:jakarta.servlet-api

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