アプリケーションを起動しようとしていますが、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>
何か案が ?
Jersey 1 & 2
(Jersey 1は明示的な依存関係、Jersey 2はjersey-test-framework-provider-jdk-http
の推移的な依存関係)の両方を使用しているため、これは不可能です。したがって、classloader
は間違ったURIBuilder
クラス。
Jersey
com.Sun.jersey
のgroup
依存関係はすべてJersey version 1
です。 Jersey version 2
はグループorg.glassfish.jersey
を使用します。
この問題の原因となっているMaven
依存関係に両方があります。
可能であれば、Jersey 2
のみを使用してください。
これは、両方を含めることによっても発生する可能性があります
<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 を参照してください。
この問題を解決します。ライブラリJAX-RS 2.0を削除し、ライブラリjersey-server-1.8.jar、jersey-core-1.8.jar、jersey-servlet-1.12.jarおよびasm-3.3.1.jarを追加します
私の場合、jsr311-api-0.10.jarとjavax.ws.rs-api-2.0.jarの両方がアプリケーションlibにありました。 jsr311 jarを削除し、問題を解決しました
私は問題を見つけることができなかった正確な問題がありました。初めてTomcatが起動してすべてが機能しましたが、サーバーの再起動後に例外が発生しました。
解決策は、Tomcatを7.0.26にダウングレードすることでした。
気付いていませんでしたが、サーバーのWEB-INF/libフォルダーにjavax.ws-rs-api-2.0.jarという名前のファイルが既にありました。 2年前に他の人によって追加されました。 WEB-INF/libフォルダーにコピーした一連のジャージファイルと競合が発生していました。ファイルをバックアップ/名前変更し、コンテナ(つまりTomcat)のサービスを再起動しましたが、動作しました。
以下の変更を行う必要があります。
<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>
<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>