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

时间:2015-12-18 05:27:42

标签: java maven servlets artifacts

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

5 个答案:

答案 0 :(得分:8)

您需要添加

<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容器中了。

答案 1 :(得分:7)

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 :(得分:5)

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

答案 3 :(得分:1)

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

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

现在,随着Java EE从Oracle迁移到Eclipse Foundation(Jakarta EE),该规范再次发生了变化。如果您想保持最新状态,请尽可能考虑使用新的组和工件:set x [regsub -all "***=r\[$bit\]" $p $value]

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

答案 4 :(得分:0)

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