Description
The jakarta.json.spi.JsonProvider
used by the Elasticsearch Java Client is resolved using the jakarta.json.spi.JsonProvider#provider()
method which unfortunately relies on the java.util.ServiceLoader#load(java.lang.Class<S>)
API without search in the classloader that loaded the Elasticsearch Java Client (java.util.ServiceLoader#load(java.lang.Class<S>, java.lang.ClassLoader)
).
In runtimes like Jenkins, this fails with ClassNotFoundException: org.glassfish.json.JsonProviderImpl
.
I would like the Elasticsearch Java client to either search the jakarta.json.spi.JsonProvider
in the classloader that Elasticsearch Java Client classes or to support manually setting it.
I like very much the pattern chosen by OpenTelemetry with io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder#setServiceClassLoader()
See
java.lang.ClassNotFoundException: org.glassfish.json.JsonProviderImpl
at jenkins.util.AntClassLoader.findClassInComponents(AntClassLoader.java:1417)
at jenkins.util.AntClassLoader.findClass(AntClassLoader.java:1372)
at jenkins.util.AntClassLoader.loadClass(AntClassLoader.java:1127)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
at jakarta.json.spi.JsonProvider.provider(JsonProvider.java:72)
Caused: jakarta.json.JsonException: Provider org.glassfish.json.JsonProviderImpl not found
at jakarta.json.spi.JsonProvider.provider(JsonProvider.java:75)
at co.elastic.clients.json.jackson.JsonValueParser.<init>(JsonValueParser.java:39)
at co.elastic.clients.json.jackson.JacksonJsonpParser.getValue(JacksonJsonpParser.java:233)
at co.elastic.clients.json.JsonpDeserializerBase$8.deserialize(JsonpDeserializerBase.java:255)
at co.elastic.clients.json.JsonpDeserializerBase$8.deserialize(JsonpDeserializerBase.java:249)
at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:75)
at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:72)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:176)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:137)
at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:75)
at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:79)
at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43)
at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:72)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:176)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:137)
at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:75)
at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:79)
at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43)
at co.elastic.clients.transport.endpoints.EndpointWithResponseMapperAttr$1.deserialize(EndpointWithResponseMapperAttr.java:56)
at co.elastic.clients.transport.rest_client.RestClientTransport.decodeResponse(RestClientTransport.java:328)
at co.elastic.clients.transport.rest_client.RestClientTransport.getHighLevelResponse(RestClientTransport.java:294)
at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:147)
at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1526)
...