2011-12-12 103 views
9

我试图让我周围的一些概念头在Java中:JAX-RS有关新泽西州和JSR的

  1. JSR(S):描述规范,但没有进行实际的实现。例如。 http://jsr311.java.net/是“RESTful Web服务的Java™API”的“主页”。它作为JSR-311所有实现的通用参考。
  2. 然而,除非您自己实现JSR-311,否则可以从http://mvnrepository.com/artifact/javax.ws.rs/jsr311-api下载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作为依赖项放在您的项目中可能会导致类路径问题?

我完全失去了意识吗?

回答

8
  1. 是的,这不是什么新鲜事。想想JDBC,java提供了 接口(Connection,Statement,ResultSet等),但是它向上提供 来提供实现。

  2. 如果您使用的是JSR-311实现类似新泽西州或Apache CXF 那么你会用javax.ws.rs注解注释你的类,如@Path@GET@Produces等,这就是为什么你需要有明确JSR-311作为maven的依赖。

  3. 是的,通常。看看JSR list on wiki

  4. 您需要JSR和实现。注释位于JSR中,实现提供了支持类,如com.sun.jersey.spi.container.servlet.ServletContainer。不,有必要将两者都作为依赖关系(见第4点);你不会遇到类路径冲突。

+0

所以也许真正的问题是为什么不运动衫将jsr-311作为一个依赖项来声明,而不是在它自己的jar中重复这些类? –

3
  1. -
  2. 人们可以从不同的来源下载文件。要获得大部分官方版本的JSR-311规范请转至其JCP download page。你很可能无法从JCP页面获得JAR文件(包含所有界面和内容),但仍然是官方的源代码。 (总是有很好的公共草稿PDF!)
  3. -
  4. 你是对的,因为泽西包含JSR-311中定义的API,但是我想补充一个编译依赖于jsr311-api JAR文件,并添加作为泽西运行依赖。这在API和实现之间创建了一个很好的分离,你可以随时换掉你的JSR-311实现[sic]。如果您打算使用泽西一路只包括泽西岛。你的POM少一点依赖。
  5. 如果Jersey包装了与JAR包含的jsr311-api相同的API,则它不会。如果它包装不同的东西,那很糟糕!如果有一个损坏其类路径上的JSR-311 API,Maven可能会在编译时吠叫(我已经看到很多java.lang.ClassFormatError:缺少代码属性的方法...错误,所以它不会被忽视,这是肯定的)。

除了这些之外,你是对的。