12

我正在尝试了解 Java 中的一些概念:

  1. JSR(s):描述规范,但没有实际的实现。例如, http://jsr311.java.net/是“Java™ API for RESTful Web Services”的“家”。它作为 JSR-311 的所有实现的通用参考。
  2. 可以从http://mvnrepository.com/artifact/javax.ws.rs/jsr311-api下载 JSR-311 的接口(?),但是,除非您自己实现 JSR-311,否则这些没有特别的价值吗?
  3. JSR(s) 通常/总是有一个参考实现。要找到它,您必须搜索“JSR XXX 参考实现”或查看规范主页(例如http://jsr311.java.net/
  4. 对于 JSR-311,此参考实现是Jersey。使用 maven,您可以从http://mvnrepository.com/artifact/com.sun.jersey/jersey-server/1.9获取球衣服务器。由于 Jersey 根据http://mvnrepository.com/artifact/javax.ws.rs/jsr311-api中的接口提供了一个实现,因此您只需在项目中添加 Jersey 作为依赖项,而不是 jsr311-api 本身. (这适用于所有 JSR 技术?)
  5. http://mvnrepository.com/artifact/javax.ws.rs/jsr311-apihttp://mvnrepository.com/artifact/com.sun.jersey/jersey-server/1.9作为项目中的依赖项可能会导致类路径问题?

我是完全离开还是进入某事?

4

2 回答 2

9
  1. 是的,这不是什么新鲜事。想想 JDBC,java 提供了接口(Connection,等) StatementResultSet但由数据库供应商提供实现。

  2. 如果您使用 JSR-311 实现,例如 Jersey 或 Apache CXF,那么您将使用注释来注释您的类javax.ws.rs,例如@Path,@GET@Produces。这就是为什么您需要明确地将 JSR-311 作为 maven 依赖项。

  3. 是的,通常。查看 wiki 上的JSR 列表

  4. 您需要 JSR 和实现。注释在 JSR 中,实现提供支持类,例如com.sun.jersey.spi.container.servlet.ServletContainer.

  5. 不,必须将两者都作为依赖项(参见第 4 点);你不会得到类路径冲突。

于 2011-12-12T15:56:47.317 回答
3
  1. ——</li>
  2. 可以从各种来源下载文件。要获取JSR-311规范的最官方版本,请访问其JCP 下载页面。您很可能无法从 JCP 页面获取 JAR 文件(包含所有接口和内容),但仍然是官方来源。(也总是有很好的公共草稿 PDF 文件!)
  3. ——</li>
  4. 你是对的,因为 Jersey 包含 JSR-311 定义的 API,但是我会在jsr311-api JAR 文件中添加一个编译依赖项,并将 Jersey 添加为运行时依赖项。这在 API 和实现之间创建了一个很好的分离,您可以随时更换您的 JSR-311 实现 [原文如此]。如果您打算一直使用泽西岛则只包括泽西岛。在你的 POM 中少了一种依赖。
  5. 如果 Jersey 打包与 jsr311-api JAR 包含的 API 相同的 API,则不会。如果它包装不同的东西,那将是可怕的!如果一个人的类路径上有一个损坏的 JSR-311 API, Maven 可能会在编译时咆哮(我已经看到很多java.lang.ClassFormatError: Absent Code attribute in method that ...错误,所以它不会去没有注意到,这是肯定的)。

除了这些,你是对的。

于 2011-12-12T15:59:50.820 回答