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



在groupId javax.servlet下的maven存储库中,我有这两个单独的servlet工件。我很困惑应该使用哪一个来构建一个简单的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

您需要添加

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

的JAR文件

如果您必须部署在不支持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

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

最新更新