Java 将Jersey客户端1.x升级到2.x时UriBuilder上的AbstractMethodError

Java 将Jersey客户端1.x升级到2.x时UriBuilder上的AbstractMethodError,java,jersey-client,jersey-2.0,Java,Jersey Client,Jersey 2.0,我们正在将Web应用程序(运行在Tomcat7上)从Jersey 1.7升级到Jersey 2.4.1。 我现在设法让服务器端工作,但是使用jersey客户端的JUnit测试抛出AbstractMethodError: java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder; at javax.ws.rs.core.UriB

我们正在将Web应用程序(运行在Tomcat7上)从Jersey 1.7升级到Jersey 2.4.1。 我现在设法让服务器端工作,但是使用jersey客户端的JUnit测试抛出AbstractMethodError: java.lang.AbstractMethodError:

javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
    at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
    at org.glassfish.jersey.client.JerseyWebTarget.<init>(JerseyWebTarget.java:72)
    at org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:180)
    at org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:69)
    at ******.test.resources.ResourceConfig.getResourceWithCredentialsAt(ResourceConfig.java:144)
    at ******.test.resources.ResourceConfig.getResourceAsUserAt(ResourceConfig.java:99)
    at ******.test.resources.UsersResourceTest.testGetAuthorizedUser(UsersResourceTest.java:251)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
位于javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
位于org.glassfish.jersey.client.JerseyWebTarget.(JerseyWebTarget.java:72)
位于org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:180)
位于org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:69)
位于******.test.resources.ResourceConfig.getResourceWithCredentialsAt(ResourceConfig.java:144)
位于******.test.resources.ResourceConfig.getResourceAsUserAt(ResourceConfig.java:99)
位于******.test.resources.UsersResourceTest.testGetAuthorizedUser(UsersResourceTest.java:251)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:47)
位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:44)
位于org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
位于org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
位于org.junit.internal.runners.statements.runafter.evaluate(runafter.java:27)
位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:309)
位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
项目由maven维护,以下是pom的依赖项:

<!-- Our webapps are tomcat servlets -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- Jersey Container to allow jersey running inside tomcat servlet -->
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <!-- Jersey core dependencies -->
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.bundles</groupId>
            <artifactId>jaxrs-ri</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <!-- Media stuff -->
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>${jersey.version}</version>
        </dependency>

        <!-- Jackson JSON handling -->
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>${jackson.version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-xml-provider</artifactId>
            <version>${jackson.version}</version>
        </dependency>

javax.servlet
javax.servlet-api
3.0.1
假如
org.glassfish.jersey.containers
jersey容器servlet
${jersey.version}
org.glassfish.jersey.core
泽西岛客户
${jersey.version}
org.glassfish.jersey.core
泽西服务器
${jersey.version}
org.glassfish.jersey.bundles
杰克斯里
${jersey.version}
org.glassfish.jersey.media
泽西岛媒体多部分
${jersey.version}
org.glassfish.jersey.media
泽西媒体公司
${jersey.version}
com.fasterxml.jackson.jaxrs
jackson jaxrs json提供程序
${jackson.version}
com.fasterxml.jackson.jaxrs
jackson jaxrs xml提供程序
${jackson.version}

显然,我错过了UriBuilder类的具体实现,但我不知道需要为此添加什么依赖项。而且,它也适用于服务器端,wut

当您看到此错误时,表示正在从其他库(如cxf-2.1.3.jar)加载UriBuilder。只需将其重命名为z-cxf-2.1.3.jar。在maven中,找到哪一个依赖项是jar,并使用类似的东西

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>app</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

${project.groupId}
应用程序
${project.version}
*
*

我发现阐明库在某种程度上依赖于jersey 1.1.7。这导致我的部分代码在仍然依赖于1.1.7API的情况下编译良好

我通过查找找到它:

find . -name *.pom -exec grep -Hn jersey {} \;

…在泽西岛上的~/.m2文件夹中。只有当您的应用程序是您机器上唯一使用maven的应用程序时,才能执行此操作。

检查此问题:我和您有相同的问题…可以提供您的WEB-INF\lib吗?查找所有库中包含cxf-2.1.3.jar的库,并使用maven exclude排除特定的jar谢谢提示!现在,我看到Maven Dependencies文件夹(eclipse)中还有jersey jar文件的1.x版本。混入2.4.1版本似乎并不正确。奇怪的是,我没有任何1.x jersey dep在POM中徘徊。你不需要有直接依赖,一些插件或Transactive依赖可能已经有了这些,你可以将它们排除在外,谢谢。这很有帮助。在我的例子中,我需要运行
mvnclean
,但您给了我一个很好的起点。