org.glassfish.jersey.internal.RuntimeDelegateImpl未找到

时间:2013-10-18 15:03:18

标签: java rest glassfish jersey jax-rs

我正在为我的项目使用jersey,并尝试从字符串中解析URI。

UriBuilder.fromUri("http://localhost:8000").build();

代码很简单,但我收到错误

java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl

似乎程序找不到代理人。我已导入javax.ws.rs.core.UriBuilder并且jersey-common 2.0应包含我的构建路径中的委托。但我仍然得到这个错误。

有人知道如何修复它吗?谢谢!

6 个答案:

答案 0 :(得分:57)

如果您使用的是Maven,请使用以下依赖项:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-common</artifactId>
    <version>2.22.2</version>
    <scope>test</scope>
</dependency>

对于Gradle,以下内容将起作用:

testCompile 'org.glassfish.jersey.core:jersey-common:2.22.2'

答案 1 :(得分:5)

针对Wildfly 10.1运行时开发我不想将Jersey引入我的构建中。使用Gradle我用了

testRuntime "org.jboss.resteasy:resteasy-jaxrs:$versions.resteasy"

resteasy版本是3.0.19.Final。这个jar包含

META-INF/services/javax.ws.rs.ext.RuntimeDelegate

带条目

org.jboss.resteasy.spi.ResteasyProviderFactory

答案 2 :(得分:3)

在我的情况下,问题是另一个名为: 的 javax.ws.rs-API-2.0.jar

删除那个jar解决了我的问题。

我用过的罐子:

<include name="jersey-client-1.9.jar" />
<include name="jersey-core-1.9.jar" />
<include name="jersey-multipart-1.9.jar" />

答案 3 :(得分:1)

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-common</artifactId>
    <version>2.26</version>
    <scope>test</scope>
</dependency>

我遇到了Java 8和jersey-common 2.22.2的问题,但2.26工作了。

答案 4 :(得分:0)

tl; dr如果您在还具有“ provider”类的应用程序中使用jersey-client 1.x,并且那里有rs-api-2.1.jar,则需要添加jersey-server 1 .x或删除rs-api-2.1(如果您碰巧还存在jsr311-api-1.1.1)。

看来这是正在发生的事情

显然,当jersey-client首次出现时,它会尝试创建具有不同mime类型的“ mime map”。

jersey-core 1.x ContextResolverFactory:

  public void init(ProviderServices providersServices, InjectableProviderFactory ipf) {
    Map<Type, Map<MediaType, List<ContextResolver>>> rs = new HashMap();
    Set<ContextResolver> providers = providersServices.getProviders(ContextResolver.class);
    Iterator i$ = providers.iterator();

    while(i$.hasNext()) {
      ContextResolver provider = (ContextResolver)i$.next();
      List<MediaType> ms = MediaTypes.createMediaTypes((Produces)provider.getClass().getAnnotation(Produces.class));
       ...

因此,如果有任何“提供者”(例如:@Produces ({MediaType.WILDCARD}))出现,它将尝试查找其类型并将其添加到mime类型列表中。但是,它会执行以下操作:

如果您有rs-api-2.1.jar:

 private static RuntimeDelegate findDelegate() {
   try {
Object delegate = FactoryFinder.find("javax.ws.rs.ext.RuntimeDelegate", "org.glassfish.jersey.internal.RuntimeDelegateImpl", RuntimeDelegate.class);

如果您还具有以下其他依赖关系,则其实现似乎有所不同:

jsr311-api-1.1.1.jar:

 private static RuntimeDelegate findDelegate() {
   try {
     Object delegate = FactoryFinder.find("javax.ws.rs.ext.RuntimeDelegate", "com.sun.ws.rs.ext.RuntimeDelegateImpl");

Jersey 1.x客户端恰巧提供了./jersey-client-.19/com/sun/ws/rs/ext/RuntimeDelegateImpl.class

Jersey 1.x服务器提供:

./jersey-server-1.19/com/sun/jersey/server/impl/provider/RuntimeDelegateImpl.class

jersey 2.0是“ org.glassfish.jersey ...”,并提供了“ org.glassfish.jersey.internal.RuntimeDelegateImpl”(显然是明智的做法)

因此,在我看来rs-api-2.1在默认情况下主要针对球衣2.x。但是如果您还包括jersey-server,碰巧也可以使用jersey-client 1.x。

使用jersey 2.x,您不需要以这种怪异的方式包含“使用客户端的服务器”,似乎就可以了。

我的直觉是更改了API(您不应该将jersey 1.x与jsr-2结合使用吗?是吧?),或者是偶然的错误,bug或jersey-client 1.x的不良设计,谁知道。

添加可以暂时添加“ jersey 2.x”或“ jersey-server 1.x”的内容也可以。

这些可以解决以下运行时故障:

Caused by: java.lang.ExceptionInInitializerError: null
    at com.sun.jersey.core.spi.factory.ContextResolverFactory.init(ContextResolverFactory.java:86)
    at com.sun.jersey.api.client.Client.init(Client.java:340)
    at com.sun.jersey.api.client.Client.access$000(Client.java:119)
    at com.sun.jersey.api.client.Client$1.f(Client.java:192)
    at com.sun.jersey.api.client.Client$1.f(Client.java:188)
    at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
    at com.sun.jersey.api.client.Client.<init>(Client.java:188)
    at com.sun.jersey.api.client.Client.<init>(Client.java:171)
    at redacted
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
    at org.familysearch.digitalarchive.aggregator.integration.ServiceAccountConfig$$EnhancerBySpringCGLIB$$a3409578.identityService(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    ... 29 common frames omitted
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
    at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:154)
    at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:121)
    at javax.ws.rs.core.MediaType.valueOf(MediaType.java:196)
    at com.sun.jersey.core.header.MediaTypes.<clinit>(MediaTypes.java:65)
    ... 48 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at javax.ws.rs.ext.FactoryFinder.newInstance(FactoryFinder.java:111)
    at javax.ws.rs.ext.FactoryFinder.find(FactoryFinder.java:209)
    at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:136)
    ... 51 common frames omitted

答案 5 :(得分:0)

compile 'org.springframework.boot:spring-boot-starter-jersey:1.2.0.RELEASE'

这对我有用!