如何为Jersey Jax-RS maven项目添加JSR-311依赖项

Wol*_*ahl 4 jax-rs jersey maven

以下问题讨论了Jersey与JAX-RS规范之间的依赖关系理论:

我假设我可以添加依赖项:

  <!--  javax.ws.rs.core e.g. Request -->
  <dependency>
     <groupId>javax.ws.rs</groupId>
     <artifactId>jsr311-api</artifactId>
     <version>1.0</version>
  </dependency>
Run Code Online (Sandbox Code Playgroud)

到我的API定义maven项目并使用Jersey/Grizzly来实现.

    <jersey.version>1.15</jersey.version>
    <grizzly.version>2.2.20</grizzly.version>       
Run Code Online (Sandbox Code Playgroud)

与此假设相反,我收到以下错误消息:

15.02.2013 08:41:25 org.glassfish.grizzly.http.server.HttpServerFilter handleRead
WARNUNG: Unexpected error
java.lang.IncompatibleClassChangeError: Class javax.ws.rs.core.Response$Status does not implement the requested interface javax.ws.rs.core.Response$StatusType
    at com.sun.jersey.spi.container.ContainerResponse.getStatus(ContainerResponse.java:571)
Run Code Online (Sandbox Code Playgroud)

什么是应该与Jersey 1.15一起使用的正确的JAX-RS API依赖?

我希望以一种可以由任何其他符合JAX-RS的库替换实现的方式来实现.

Dav*_*ely 5

问题是你的JSR 311 API依赖是版本1.0,而Jersey 1.15是JSR 311版本1.1实现.比较http://jsr311.java.net/nonav/releases/1.0/javax/ws/rs/core/Response.Status.htmlhttp://jsr311.java.net/nonav/releases/1.1/javax/ws /rs/core/Response.Status.html,你会看到后者实现了ResponseType接口,但前者没有.

您应该能够在构建时类路径上获得JSR 311版本1.1.1 API类文件,方法是声明:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>jsr311-api</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

事实上,球衣核心pom.xml已经做到了 - 上面只是http://repo1.maven.org/maven2/com/sun/jersey/jersey-core/1.15/jersey-core-1.15.pom中的第一个依赖..

在像Glassfish这样的容器中,你现在已经完成了,因为容器将负责在运行时为你提供API类(这就是为什么在jersey自己的Maven POM中的范围provided不是compile).然而,对于灰熊Web容器,很可能你需要确保API类在运行时可用(通过使用<dependency>上述声明,但改变<scope>providedcompile会做到这一点).