J'essaie de démarrer l'application mais avec Tomcat 7
et j'ai une exception comme celle-ci.
Je pense que cela peut être quelque chose avec Maven dependency
, mais je suis sûr. Si certains savent ce qui se passe s'il vous plaît pour réponse :)
Exception:
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>
Une idée ?
Vous utilisez les deux Jersey 1 & 2
(Jersey 1 est une dépendance explicite, Jersey 2 est une dépendance transitive de jersey-test-framework-provider-jdk-http
) et ce n'est pas possible - la classloader
récupère la mauvaise classe URIBuilder
.
Les dépendances Jersey
dans group
com.Sun.jersey
sont toutes Jersey version 1
. Jersey version 2
utilise le groupe org.glassfish.jersey
.
Vous avez les deux dans vos dépendances Maven
qui sont à l'origine de ce problème.
Si possible, utilisez uniquement Jersey 2
.
Cela peut aussi être causé en incluant les deux
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.xxx</version>
</dependency>
Et
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.xx</version>
</dependency>
Les artefacts com.Sun.jersey
incluent une version (1.0) de l’espace de noms javax.ws.rs; il est donc probablement le seul nécessaire. rs-api inclut également une version de JAX-RS (2.0) dans le même espace de noms. Ainsi, lorsque vous associez les deux versions, mais que leur version est différente, cela peut entraîner un conflit.
Cela peut être causé par "tout" conflit qui fournit à la fois JAX-RS 1.0 et JAX-RS 2.0. JAX-RS 1.0 est souvent fourni par les artefacts com.Sun.jersey:jersey*
(en particulier jersey-core), et JAX-RS 2.0 par l'un des artefacts org.glassfish.jersey.core:jersey*
, ou l'artefact javax.ws.rs:javax.ws.rs-api
, ou éventuellement l'artefact javax:javaee-api
, ou par l'artefact jsr311-api-1.0
.
Le problème est qu’étant donné que ce sont des noms de groupe + artefacts différents, maven par défaut inclura inconsciemment _ _ les deux versions 1.0 et 2.0 dans la distribution finale.
Le problème est d'autant plus compliqué que, puisqu'il y a plusieurs fichiers jar en conflit dans le chemin d'accès aux classes, "parfois", cela pourrait fonctionner, puis "parfois", mais parfois (cela signifierait que "cela fonctionnait avec Tomcat7, mais échouait avec Tomcat8", etc.).
Ce qui complique encore le problème, c’est que si vous avez une seule dépendance qui dépend de l’un des éléments ci-dessus de manière transitoire, alors Maven vous fournira les deux versions et vous serez fatigué. Vous pouvez trouver ce qui vient d'où avec mvn dependency:tree
Donc, vous devez soit aller à "tous les 1.0" ou "tous les 2.0." Dans notre cas, nous avons utilisé la version 1.0 en ajoutant des exclusions de dépendance transitive à notre pom. Si vous voulez aller tous les 2.0 voir ici .
Je résous ce problème: je supprime la bibliothèque JAX-RS 2.0, j'ajoute les bibliothèques jersey-server-1.8.jar, jersey-core-1.8.jar, jersey-servlet-1.12.jar et asm-3.3.1.jar
Dans mon cas, jsr311-api-0.10.jar et javax.ws.rs-api-2.0.jar se trouvaient dans l'application lib. J'ai supprimé le bocal jsr311 et le problème a été résolu
J'ai eu le problème exact ne pouvais pas trouver le problème . La première fois le Tomcat est monté et tout a fonctionné mais après le redémarrage du serveur J'ai eu l'exception.
La solution consistait à rétrograder Tomcat à la version 7.0.26. Le problème n’était pas sûr de savoir pourquoi.
Je ne m'en rendais pas compte, mais il y avait un fichier nommé javax.ws-rs-api-2.0.jar déjà dans le dossier WEB-INF/lib du serveur. Il a été ajouté il y a deux ans par quelqu'un d'autre. Cela provoquait un conflit avec l'ensemble des fichiers jersey que j'ai copiés dans le dossier WEB-INF/lib . J'ai sauvegardé/renommé le fichier, redémarré le service de mon conteneur (Tomcat) et tout a fonctionné.
Nous devons apporter les modifications ci-dessous:
<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>