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

我们正在将我们的Web应用程序(在Tomcat7上运行)从Jersey 1.7升级到Jersey 2.4.1。 我设法让服务器端正常工作,但是使用jersey-client的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.(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) 

该项目由maven维护,这里是pom的依赖项:

   javax.servlet javax.servlet-api 3.0.1 provided    org.glassfish.jersey.containers jersey-container-servlet ${jersey.version}    org.glassfish.jersey.core jersey-client ${jersey.version}   org.glassfish.jersey.core jersey-server ${jersey.version}   org.glassfish.jersey.bundles jaxrs-ri ${jersey.version}    org.glassfish.jersey.media jersey-media-multipart ${jersey.version}   org.glassfish.jersey.media jersey-media-json-jackson ${jersey.version}    com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider ${jackson.version}   com.fasterxml.jackson.jaxrs jackson-jaxrs-xml-provider ${jackson.version}  

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

我发现enunciate库在某种程度上取决于jersey1.1.7。 这导致我的代码部分编译正常,但它依赖于1.1.7 API。

我通过做一个发现找到了它:

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

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

当您看到此错误时,表示正在从其他库(如cxf-2.1.3.jar)加载UriBuilder。 只需将其重命名为z-cxf-2.1.3.jar即可。 它应该工作正常。在maven中找到哪个依赖项带来jar并使用这样的东西

  ${project.groupId} app ${project.version}   * *