我尝试启动应用程序,但使用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
:
1.0 4.0.0.RELEASE 3.2.0.RELEASE 1.18.1 climbing-portal-facade climbing-portal-facade ${application.version} com.sun.jersey jersey-core ${jersey.version} com.sun.jersey jersey-server ${jersey.version} com.sun.jersey jersey-json ${jersey.version} org.glassfish.jersey.test-framework.providers jersey-test-framework-provider-jdk-http 2.7 com.sun.jersey.contribs jersey-spring ${jersey.version} org.springframework spring org.springframework spring-core org.springframework spring-web org.springframework spring-beans org.springframework spring-context org.springframework spring-aop org.springframework spring-web ${spring.version}
任何的想法 ?
你正在使用两者Jersey 1 & 2
(Jersey 1是一个明确的依赖,Jersey 2是一个传递依赖jersey-test-framework-provider-jdk-http
),这是不可能的 - 所以这classloader
是错误的URIBuilder
类.
的Jersey
依赖关系group
com.sun.jersey
都是Jersey version 1
.
Jersey version 2
使用该组org.glassfish.jersey
.
您的Maven
依赖项中有两个都会导致此问题.
如果可能只使用Jersey 2
.
这也可以通过包括两者来引起
com.sun.jersey jersey-server 1.xxx
和
javax.ws.rs javax.ws.rs-api 2.xx
com.sun.jersey
工件包括javax.ws.rs命名空间的版本(1.0),因此它是唯一可能需要的版本.rs-api还在同一名称空间中包含一个JAX-RS(2.0)版本,因此当你将两者放在一起时,它们的版本不同,可能会导致你看到的冲突.
这可能是由于"任何"冲突同时提供了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一起失败"等)
进一步使问题变得复杂的是,如果你有一个依赖于上述任何一个的单一依赖,那么maven将引入两个版本并且你被软化了.你可以找到来自哪里的东西mvn dependency:tree
所以你必须要么"全部1.0"或"全部2.0".在我们的例子中,我们通过向我们的pom添加一些传递依赖性排除来使用所有1.0.如果你想要全部2.0,请看这里.