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