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
在我的 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