我尝试启动应用程序,但使用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
(泽西1是一个明确的依赖,泽西2是jersey-test-framework-provider-jdk-http
的传递依赖),这是不可能的 - 所以classloader
正在挑选错误的URIBuilder
类。
qazxsw poi qazxsw poi中的qazxsw poi依赖都是Jersey
。 group
使用com.sun.jersey
组。
您的Jersey version 1
依赖项中都存在导致此问题的两者。
如果可能,只使用Jersey version 2
。
这也可以通过包括两者来引起
org.glassfish.jersey
和
Maven
Jersey 2
工件包含javax.ws.rs命名空间的版本(1.0),因此它是唯一可能需要的工具。 rs-api还在同一名称空间中包含一个JAX-RS(2.0)版本,因此当你将两者放在一起时,它们的版本不同,可能会导致你看到的冲突。
这可能是由于“任何”冲突同时提供了JAX-RS 1.0和JAX-RS 2.0。 JAX-RS 1.0经常由<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.xxx</version>
</dependency>
工件(特别是jersey-core)提供,而JAX-RS 2.0由任何<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.xx</version>
</dependency>
工件或com.sun.jersey
工件,或者可能是com.sun.jersey:jersey*
工件或org.glassfish.jersey.core:jersey*
工件提供。
问题在于,由于它们是不同的组+工件名称,默认情况下maven会在不知不觉中将1.0和2.0版本的jar包含到您的最终发行版中。
使问题进一步复杂化的是,由于类路径中存在多个冲突的jar,“有时”它可能起作用,然后“有时”它可能不起作用(因此一些报告“它与tomcat7一起工作,但是与tomcat8一起失败”等)
进一步使问题变得复杂的是,如果你有一个依赖于上述任何一个的单一依赖,那么maven将引入两个版本并且你被软化了。你可以找到javax.ws.rs:javax.ws.rs-api
的地方
所以你必须要么“全部1.0”或“全部2.0”。在我们的例子中,我们通过向我们的pom添加一些传递依赖性排除来使用所有1.0。如果你想要全部2.0,请参阅javax:javaee-api
。
我解决了这个问题:我删除了库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都在应用程序库中。我删除了jsr311 jar,问题解决了
我有确切的问题无法找到问题。在第一次Tomcat上升并且一切正常但在重新启动服务器后我有异常。
解决方案是将tomcat降级到7.0.26。虽然这样做但不确定原因。
我没有意识到,但是在服务器上的WEB-INF / lib文件夹中已经有一个名为javax.ws-rs-api-2.0.jar的文件。它是两年前由其他人添加的。它导致与我复制到WEB-INF / lib文件夹的一组球衣文件发生冲突。我备份/重命名了该文件,重新启动了我的容器(即Tomcat)的服务,并且它工作正常。
我们需要进行以下更改:
jsr311-api-1.0
mvn dependency:tree