当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《java.lang.AbstractMethodError:javax.ws.rs.core.UriBuilder.uri》经验,为你挑选了2个好方法。

我尝试启动应用程序,但使用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}
        
    

任何的想法 ?



1> Will..:

你正在使用两者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.



2> Sloloem..:

这也可以通过包括两者来引起


  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,请看这里.


我知道.maven需要这些版本,但由于答案与版本无关,因此删除它们可能会让它更容易在Google上找到
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有