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



我正在尝试运行一个jersey客户端,但遇到了这个问题。

WS等级:

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,jackson-core-as-1.9.2罐,jackson-axrs-1.9.2.jar,杰克森-马普阿斯-1.9.2罐,jackson-xc-1.9.2.jar,jersey-bundle-1.8罐,jersey-client-1.18.jar,jersey-core-1.18.jar,jersey-json-1.18.jar,jersey-server-1.18.jar,jersey-servlet-1.18.jar,丢弃-1.1罐,jsr311-api-1.1.1.jar

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

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

在我的案例中,我没有将jersey核心jar作为运行时依赖项。我添加后,它似乎运行良好。

对于追随者,这些(在本例中使用mockito,但有点通用):

java.lang.NoClassDefFoundError: com/sun/jersey/spi/inject/Errors$Closure
java.lang.NoClassDefFoundError: com/sun/jersey/core/header/LinkHeaders

意思是"您对jersey核心1.0.2有依赖性,也对jersery客户端1.11有依赖性"(需要将核心与客户端版本更紧密地匹配)。不幸的是,"服务器"one_answers"客户端"都使用"核心",因此最终它们实际上都必须精确匹配:|

最新更新