web-dev-qa-db-ja.com

java.lang.AbstractMethodError:javax.ws.rs.core.UriBuilder.uri

アプリケーションを起動しようとしていますが、Tomcat 7そして、このような例外があります。

これはMaven dependency、しかし私は確信しています。何が起こっているのか知っている人は答えてください:)

例外:

message Servlet execution threw an exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet execution threw an exception
    org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)

root cause

Java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
    javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.Java:119)
    com.Sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.Java:651)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
    org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.50 logs.

Maven POM

<properties>
        <application.version>1.0</application.version>
        <spring.version>4.0.0.RELEASE</spring.version>
        <spring.security.version>3.2.0.RELEASE</spring.security.version>
        <jersey.version>1.18.1</jersey.version>
    </properties>



    <dependencies>
        <dependency>
            <groupId>climbing-portal-facade</groupId>
            <artifactId>climbing-portal-facade</artifactId>
            <version>${application.version}</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>com.Sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
            <artifactId>jersey-test-framework-provider-jdk-http</artifactId>
            <version>2.7</version>
        </dependency>

        <!-- Jersey + Spring -->
        <dependency>
            <groupId>com.Sun.jersey.contribs</groupId>
            <artifactId>jersey-spring</artifactId>
            <version>${jersey.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-beans</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aop</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>

何か案が ?

31
user3570228

Jersey 1 & 2(Jersey 1は明示的な依存関係、Jersey 2はjersey-test-framework-provider-jdk-httpの推移的な依存関係)の両方を使用しているため、これは不可能です。したがって、classloaderは間違ったURIBuilderクラス。

Jerseycom.Sun.jerseygroup依存関係はすべてJersey version 1です。 Jersey version 2はグループorg.glassfish.jerseyを使用します。

この問題の原因となっているMaven依存関係に両方があります。

可能であれば、Jersey 2のみを使用してください。

43
Will

これは、両方を含めることによっても発生する可能性があります

<dependency>
  <groupId>com.Sun.jersey</groupId>
  <artifactId>jersey-server</artifactId>
  <version>1.xxx</version>
</dependency>

And

<dependency>
  <groupId>javax.ws.rs</groupId>
  <artifactId>javax.ws.rs-api</artifactId>
  <version>2.xx</version>
</dependency>

com.Sun.jerseyアーティファクトにはjavax.ws.rs名前空間のバージョン(1.0)が含まれているため、おそらく唯一必要なものです。 rs-apiには同じ名前空間にJAX-RS(2.0)のバージョンも含まれているため、2つを一緒に持っているが、バージョンが異なると、競合が発生する可能性があります。

これは、JAX-RS 1.0とJAX-RS 2.0の両方を提供する「任意の」競合が原因で発生する可能性があります。 JAX-RS 1.0はcom.Sun.jersey:jersey*アーティファクト(特にjersey-core)によって頻繁に提供され、JAX-RS 2.0はorg.glassfish.jersey.core:jersey*アーティファクト、またはjavax.ws.rs:javax.ws.rs-apiアーティファクトのいずれかによって提供されます。おそらくjavax:javaee-apiアーティファクト、またはjsr311-api-1.0アーティファクト。

問題は、それらが異なるグループ+アーティファクト名であるため、mavenはデフォルトで無意識に1.0と2.0の両方のバージョンjarを最終的なディストリビューションに含めることです。

さらに問題を複雑にしているのは、クラスパスに複数の競合するjarがあるため、「時々」動作する可能性があり、「時々」動作しない可能性があるためです(そのため、「Tomcat7では動作しましたが、Tomcat8では失敗します」などの報告があります)。

さらに問題を複雑にしているのは、上記のいずれかに一時的に依存する依存関係が1つでもある場合、mavenは両方のバージョンを持ち込み、使いこなしてしまうことです。 mvn dependency:treeでどこから来ているのかを見つけることができます

したがって、「すべて1.0」または「すべて2.0」に移動する必要があります。私たちのケースでは、pomにいくつかの推移的な依存関係の除外を追加することで、すべての1.0を使用しました。 2.0にすべて移行する場合は、 here を参照してください。

23
Sloloem

この問題を解決します。ライブラリJAX-RS 2.0を削除し、ライブラリjersey-server-1.8.jar、jersey-core-1.8.jar、jersey-servlet-1.12.jarおよびasm-3.3.1.jarを追加します

4
pedrosakki

私の場合、jsr311-api-0.10.jarとjavax.ws.rs-api-2.0.jarの両方がアプリケーションlibにありました。 jsr311 jarを削除し、問題を解決しました

3
Alessandra

私は問題を見つけることができなかった正確な問題がありました。初めてTomcatが起動してすべてが機能しましたが、サーバーの再起動後に例外が発生しました。

解決策は、Tomcatを7.0.26にダウングレードすることでした。

2
Nir Sivan

気付いていませんでしたが、サーバーのWEB-INF/libフォルダーにjavax.ws-rs-api-2.0.jarという名前のファイルが既にありました。 2年前に他の人によって追加されました。 WEB-INF/libフォルダーにコピーした一連のジャージファイルと競合が発生していました。ファイルをバックアップ/名前変更し、コンテナ(つまりTomcat)のサービスを再起動しましたが、動作しました。

2
user3621633

以下の変更を行う必要があります。

web.xml

    <servlet>
      <servlet-name>RESTful Jersey Web Service Sample</servlet-name>
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>      
         <init-param>
                   <param-name>jersey.config.server.provider.packages</param-name>
                   <param-value>com.subu.jersey.rest</param-value>
         </init-param>
    </servlet>

pom.xml

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.17</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.17</version>
    </dependency>
1
Subhasish Sahu