web-dev-qa-db-ja.com

スレッド「メイン」の例外Java.lang.NoClassDefFoundError:クラスcom.Sun.jersey.core.header.MediaTypesを初期化できませんでした

ジャージクライアントを実行しようとしていますが、この問題に直面しています。

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)

私は次のjarファイルを使用しています。

asm-3.1.jar、jackson-core-asl-1.9.2.jar、jackson-jaxrs-1.9.2.jar、jackson-mapper-asl-1.9.2.jar、jackson-xc-1.9。 2.jar、jersey-bundle-1.8.jar、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、jettison-1.1.jar、jsr311-api-1.1.1.jar

8
anij

通常、コードを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ライブラリのバージョンがサーバーにロードされていることを確認する必要があります(jsr311-api jarの0.9バージョンは廃止されています)。また、jersey-bundle-1.8.jarに対してコンパイルし、jersey-bundle-1.8.jarおよびjsr311-api-1.1.1.jarで実行する必要があります。

9

私の場合、実行時の依存関係としてjersey-corejarをプルしていませんでした。追加すると、問題なく動作するように見えました。

1
sudhir mohanraj

フォロワーの場合、これら(この例ではmockitoを使用しますが、一般的なものです):

Java.lang.NoClassDefFoundError: com/Sun/jersey/spi/inject/Errors$Closure

Java.lang.NoClassDefFoundError: com/Sun/jersey/core/header/LinkHeaders

「jersey-core1.0.2に依存し、jersey-client 1.11にも依存している」という意味です(コアとクライアントのバージョンをより厳密に一致させる必要があります)。残念ながら、「サーバー」と「クライアント」はどちらも「コア」を使用するため、最終的にはすべてが正確に一致する必要があります:|

0
rogerdpack