【问题标题】:Why does Jersey 2.22 have "javax.servlet-api-3.0.1" included in the Jersey bundle?为什么 Jersey 2.22 的 Jersey 包中包含“javax.servlet-api-3.0.1”?
【发布时间】:2015-10-20 17:59:30
【问题描述】:

Servlet 规范 3.0:

Web 应用程序类加载器 容器用来在 WAR 中加载 servlet 的类加载器必须允许 开发人员在以下 WAR 中加载库 JAR 中包含的任何资源 使用 getResource 的普通 Java SE 语义。如 Java EE 许可证中所述 协议,不属于 Java EE 产品的 servlet 容器不应该允许 覆盖 Java SE 平台类的应用程序,例如 java.* 和 javax.* 命名空间,Java SE 不允许修改。容器 不应允许应用程序覆盖或访问容器的实现 类

因此,我不明白为什么 Jersey 2.22 在 Jersey 2.22 捆绑包中包含 javax.servlet-api-3.0.1 jar。有什么合理的解释为什么它在那里?默认情况下,我相信Glassfish、Tomcat等容器在lib目录下都有自己的servlet-api.jar。

【问题讨论】:

  • 奇怪的是他们会添加一个provided jar。当我们使用 Maven 时,它肯定不会被拉进来。我的猜测是因为 Jersey 支持 Servlet 组件的注入,HttpServletRequest/ResponseServletContext。这只是一个猜测。但是即使将 jar 包含到您的项目中,您也应该确保它没有内置到最终战争中。您应该始终使用提供的服务器。
  • 我也是这么想的……很奇怪。

标签: java servlets jersey


【解决方案1】:

如果您检查此link,您会发现它是一个提供的依赖项,这意味着该依赖项是编译应用程序所必需的,但应该是使用库时默认提供。

Maven documentation 解释了provided 依赖范围的工作原理:

这很像compile [依赖范围],但表明你 期望 JDK 或容器在运行时提供依赖项。 例如,在为 Java Enterprise 构建 Web 应用程序时 版本,您将设置对 Servlet API 和相关的依赖项 由于 Web 容器提供了 Java EE API 以提供范围 那些课。此范围仅适用于编译和 测试类路径,并且不可传递。

Jersey 2.22.x bundle 包含 JAX-RS 2.0 API jar、所有核心 Jersey 模块 jar 以及所有必需的第 3 方依赖项。

【讨论】:

  • 所以,如果我理解正确的话,Jersey 需要 javax.servlet-api.jar 只是为了编译时间。对于运行时,它将使用我的 servlet 容器(Tomcat - servlet-api.jar)的类路径中的任何 .jar。对吗?
  • @MiguelPortugal 没错!对于 Jersey 2.22.x,您的服务器必须提供 javax.servlet-api 依赖项。
  • 好的!奇怪的是,我的构建路径中没有包含 javax.servlet-api.jar,但我的应用程序已编译并运行良好。可能是因为我没有使用该 .jar 中的任何内容?
  • @MiguelPortugal 如果您的应用程序不直接使用 javax.servlet-api.jar,它应该可以正常编译。如果您尝试在没有该 JAR 的情况下编译 Jersey 2.22.x 源代码,它将失败。
猜你喜欢
  • 2014-04-29
  • 2017-10-04
  • 1970-01-01
  • 2014-05-17
  • 2017-11-18
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
相关资源
最近更新 更多