线程“main”中的异常java.lang.NoClassDefFoundError:无法初始化类com.sun.jersey.core.header.MediaTypes

时间:2013-12-10 06:36:58

标签: java jersey jax-rs jersey-client

我正在尝试经营一个球衣客户并面对这个问题。

WS Class:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/hello")
public class HelloWorldService {

@GET
@Path("/vip")
@Produces(MediaType.APPLICATION_JSON)
public Response getMsg(@QueryParam("msg") String msg) {

    String output = "Jersey say : " + msg;

    return Response.status(200).entity(output).build();

}

}

客户类:

    import com.sun.jersey.api.client.Client;
    import com.sun.jersey.api.client.ClientResponse;
    import com.sun.jersey.api.client.WebResource;

    public class JerseyClientGet {

        public static void main(String[] args) {
            try {

                Client client = Client.create();

                WebResource webResource = client
                        .resource("http://localhost:8080/TestRest/rest/hello/vip?msg=ABCD");

                ClientResponse response = webResource.accept("application/json")
                        .get(ClientResponse.class);

                if (response.getStatus() != 200) {
                    throw new RuntimeException("Failed : HTTP error code : "
                            + response.getStatus());
                }

                String output = response.getEntity(String.class);

                System.out.println("Output from Server .... \n");
                System.out.println(output);

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

问题是当我尝试执行客户端类时,会出现以下错误消息

            Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class com.sun.jersey.core.header.MediaTypes
                at com.sun.jersey.core.spi.factory.MessageBodyFactory.initReaders(MessageBodyFactory.java:182)
                at com.sun.jersey.core.spi.factory.MessageBodyFactory.initReaders(MessageBodyFactory.java:176)
                at com.sun.jersey.core.spi.factory.MessageBodyFactory.init(MessageBodyFactory.java:162)
                at com.sun.jersey.api.client.Client.init(Client.java:342)
                at com.sun.jersey.api.client.Client.access$000(Client.java:118)
                at com.sun.jersey.api.client.Client$1.f(Client.java:191)
                at com.sun.jersey.api.client.Client$1.f(Client.java:187)
                at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
                at com.sun.jersey.api.client.Client.<init>(Client.java:187)
                at com.sun.jersey.api.client.Client.<init>(Client.java:159)
                at com.sun.jersey.api.client.Client.create(Client.java:669)
                at com.mkyong.client.JerseyClientGet.main(JerseyClientGet.java:12)

我正在使用以下罐子:

ASM-3.1.jar, 杰克逊核心ASL-1.9.2.jar, 杰克逊JAXRS-1.9.2.jar, 杰克逊映射器-ASL-1.9.2.jar, 杰克逊-XC-1.9.2.jar, 球衣束-1.8.jar, 新泽西州的客户 - 1.18.jar, 新泽西州的核心1.18.jar, 新泽西州JSON-1.18.jar, 新泽西服务器1.18.jar, 新泽西州的servlet-1.18.jar, 抛弃-1.1.jar, JSR311-API-1.1.1.jar

3 个答案:

答案 0 :(得分:9)

通常,当你的代码针对jersey-bundle-1.8.jar和jsr311-api-0.9.jar进行编译时,你会遇到这个问题。但在这里我可以看到你正在使用jsr311-api-1.1.1.jar。然后下一个问题是应用程序/ Web服务器将加载旧的jar文件。例如:GlassFish 3.1一个带有Jersy 1.5(可能优先于你的库)。

理想情况下,您需要检查服务器中加载的JSR-311库的版本(jsr311-api jar的0.9版本已过时)。 你应该针对jersey-bundle-1.8.jar进行编译,并使用jersey-bundle-1.8.jar和jsr311-api-1.1.1.jar运行

答案 1 :(得分:1)

在我的情况下,我并没有将jersey-core jar作为运行时依赖项。一旦我添加它似乎工作正常。

答案 2 :(得分:0)

对于粉丝,这些(在这种情况下使用mockito,但有点通用):

<div class="img-container">
    <div *ngFor="let layer of myLayers">
        <img id="4-image" class="layer img-responsive  layer-box-image" name="4-layer" src={{layer.fullImageURL}} style="z-index: 14" />
        <img id="15-image" class="layer img-responsive  layer-box-image" name="15-layer" src={{layer.fullImageURL}} style="z-index: 15" />
    </div>
</div>

意味着“你依赖于jersey-core 1.0.2以及对jersey-client 1.11的依赖”(需要更紧密地匹配核心与客户端版本)。不幸的是,“服务器”和“客户端”都使用“核心”,所以最终它们几乎都必须完全匹配:|