[ 
https://issues.apache.org/jira/browse/SOLR-17089?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17794819#comment-17794819
 ] 

Jason Gerlowski commented on SOLR-17089:
----------------------------------------

Spent some time looking into this.  Still confused about some things, but 
others are making a little more sense.

bq. it's surprising that it occurs at all - classpath scanning and plugin 
"auto-detection" should be disabled in our Jersey apps

Good news: "auto-detection" is correctly disabled as we intend.  The 
"DataSourceProvider" class that causes the failure here isn't getting being 
picked up by scanning the "Extraction" jars - it's something Jersey always 
[registers 
internally|https://github.com/eclipse-ee4j/jersey/blob/bd7774f3baa4768c7d2f83557a5f1d51c335acd8/core-common/src/main/java/org/glassfish/jersey/message/internal/MessagingBinders.java#L266]
 on startup.

The question I'm still trying to understand is why DataSourceProvider 
registration fails when "extraction" is enabled.  The registration fails with a 
NCDFE for "javax.activation.DataSource", which lives in the 
"jakarta.activation" jar, which is definitely on the classpath for the 
"extraction" module.

{code}
$ find . -name "*activation*jar"
./modules/extraction/lib/jakarta.activation-1.2.2.jar
./modules/extraction/lib/jakarta.activation-api-1.2.2.jar
{code}

Note above that the extraction jars aren't on the 'vanilla' classpath - they're 
only added by the "extraction" module.
So the observed behavior is the exact opposite of what I'd expect: how are we 
*not* getting a NCDFE in normal runs that don't enable "extraction" (and 
therefore don't have the "activation" jar on the classpath)?

The behavior is clearly tied to this dep in some way, but I can't make sense of 
it.  Hopefully someone else can see what I'm missing.

----

One potential fix here would be to upgrade our Jersey version onto 3.x.  
"DataSourceProvider" as an implementation detail appears to be gone entirely in 
Jersey 3.x, so the upgrade will definitely fix this.  So if we can't fix the 
problem more subtly, we can always upgrade.

> Extraction module causes Jersey code to throw NoClassDefFoundError
> ------------------------------------------------------------------
>
>                 Key: SOLR-17089
>                 URL: https://issues.apache.org/jira/browse/SOLR-17089
>             Project: Solr
>          Issue Type: Improvement
>      Security Level: Public(Default Security Level. Issues are Public) 
>          Components: v2 API
>    Affects Versions: 9.4
>            Reporter: Jason Gerlowski
>            Priority: Minor
>
> (Credit to David Smiley for bringing this up and for the repro steps.)
> In certain circumstances, Jersey application initialization runs into a 
> NoClassDefFoundError, usually for the "javax.activation.DataSource" class.
> From the stacktrace (see below) what appears to be happening is that Jersey 
> uses this class somehow in looking for custom "MessageBodyWriter" and 
> "MessageBodyReader" implementations.  (MBR and MBW are two interfaces that 
> Jersey provides to allow serialization/deserialization of request and 
> response bodies, respectively.) Somewhere in this process, Jersey runs into 
> the NoClassDefFoundError.
> It's unclear why this stacktrace only occurs with the 'extraction' jars on 
> the classpath.  And it's surprising that it occurs at all - classpath 
> scanning and plugin "auto-detection" should be disabled in our Jersey apps 
> via the "jersey.config.server.disableAutoDiscovery" and 
> "jersey.config.server.disableMetainfServicesLookup" properties that are set 
> on all apps.
> AFAICT, the warning and stacktrace is largely just noise.  Jersey fails to 
> register whatever custom component we're picking up in the "extraction" jars, 
> but since we're not trying to register any components from those in the first 
> place, this isn't really a problem.
> But it's still worth understanding better why this occurs and at the least 
> suppressing the stack trace to avoid distracting users.
> It can be reproduced trivially with the docker command: "docker run --rm -p 
> 8983:8983 -e SOLR_MODULES=extraction solr:9.4 solr-demo"
> The stacktrace/warning in the logs can be seen below:
> {code}
> 2023-11-29 15:03:58.172 WARN  (coreLoadExecutor-11-thread-1) [ x:demo] 
> o.g.j.i.Errors The following warnings have been detected: WARNING: HK2 
> service reification failed for 
> [org.glassfish.jersey.message.internal.DataSourceProvider] with an exception:
> MultiException stack 1 of 2
> java.lang.NoClassDefFoundError: javax/activation/DataSource
>       at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
>       at java.base/java.lang.Class.privateGetDeclaredConstructors(Unknown 
> Source)
>       at java.base/java.lang.Class.getDeclaredConstructors(Unknown Source)
>       at org.jvnet.hk2.internal.Utilities$3.run(Utilities.java:1354)
>       at org.jvnet.hk2.internal.Utilities$3.run(Utilities.java:1350)
>       at java.base/java.security.AccessController.doPrivileged(Unknown Source)
>       at 
> org.jvnet.hk2.internal.Utilities.getAllConstructors(Utilities.java:1350)
>       at 
> org.jvnet.hk2.internal.Utilities.findProducerConstructor(Utilities.java:1293)
>       at 
> org.jvnet.hk2.internal.DefaultClassAnalyzer.getConstructor(DefaultClassAnalyzer.java:60)
>       at 
> org.glassfish.jersey.inject.hk2.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:124)
>       at org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:156)
>       at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:105)
>       at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:156)
>       at 
> org.jvnet.hk2.internal.SystemDescriptor.internalReify(SystemDescriptor.java:716)
>       at 
> org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:670)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:442)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.narrow(ServiceLocatorImpl.java:2300)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.access$1200(ServiceLocatorImpl.java:106)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl$10.compute(ServiceLocatorImpl.java:1385)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl$10.compute(ServiceLocatorImpl.java:1380)
>       at 
> org.glassfish.hk2.utilities.cache.internal.WeakCARCacheImpl.compute(WeakCARCacheImpl.java:105)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetAllServiceHandles(ServiceLocatorImpl.java:1442)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.getAllServiceHandles(ServiceLocatorImpl.java:1368)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.getAllServiceHandles(ServiceLocatorImpl.java:1356)
>       at 
> org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.getAllServiceHolders(AbstractHk2InjectionManager.java:135)
>       at 
> org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager.getAllServiceHolders(ImmediateHk2InjectionManager.java:30)
>       at 
> org.glassfish.jersey.internal.inject.Providers.getServiceHolders(Providers.java:307)
>       at 
> org.glassfish.jersey.internal.inject.Providers.getCustomProviders(Providers.java:151)
>       at 
> org.glassfish.jersey.message.internal.MessageBodyFactory.initialize(MessageBodyFactory.java:219)
>       at 
> org.glassfish.jersey.message.internal.MessageBodyFactory$MessageBodyWorkersConfigurator.postInit(MessageBodyFactory.java:114)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$2(ApplicationHandler.java:353)
>       at java.base/java.util.Arrays$ArrayList.forEach(Unknown Source)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:353)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:297)
>       at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
>       at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
>       at 
> org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:296)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:261)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:236)
>       at org.apache.solr.core.SolrCore.lambda$new$2(SolrCore.java:1158)
>       at 
> org.apache.solr.jersey.JerseyAppHandlerCache.lambda$computeIfAbsent$0(JerseyAppHandlerCache.java:53)
>       at 
> com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$doComputeIfAbsent$14(BoundedLocalCache.java:2688)
>       at java.base/java.util.concurrent.ConcurrentHashMap.compute(Unknown 
> Source)
>       at 
> com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent(BoundedLocalCache.java:2686)
>       at 
> com.github.benmanes.caffeine.cache.BoundedLocalCache.computeIfAbsent(BoundedLocalCache.java:2669)
>       at 
> com.github.benmanes.caffeine.cache.LocalCache.computeIfAbsent(LocalCache.java:112)
>       at 
> com.github.benmanes.caffeine.cache.LocalManualCache.get(LocalManualCache.java:62)
>       at 
> org.apache.solr.jersey.JerseyAppHandlerCache.computeIfAbsent(JerseyAppHandlerCache.java:53)
>       at org.apache.solr.core.SolrCore.<init>(SolrCore.java:1151)
>       at org.apache.solr.core.SolrCore.<init>(SolrCore.java:1056)
>       at 
> org.apache.solr.core.CoreContainer.createFromDescriptor(CoreContainer.java:1705)
>       at 
> org.apache.solr.core.CoreContainer.lambda$loadInternal$12(CoreContainer.java:1043)
>       at 
> com.codahale.metrics.InstrumentedExecutorService$InstrumentedCallable.call(InstrumentedExecutorService.java:234)
>       at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
>       at 
> org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor.lambda$execute$0(ExecutorUtil.java:294)
>       at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown 
> Source)
>       at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown 
> Source)
>       at java.base/java.lang.Thread.run(Unknown Source)
> Caused by: java.lang.ClassNotFoundException: javax.activation.DataSource
>       at java.base/java.net.URLClassLoader.findClass(Unknown Source)
>       at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
>       at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
>       at 
> org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:460)
>       at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
>       ... 59 more
>       Suppressed: java.lang.ClassNotFoundException: 
> javax.activation.DataSource
>               at java.base/java.net.URLClassLoader.findClass(Unknown Source)
>               at 
> org.eclipse.jetty.webapp.WebAppClassLoader.findClass(WebAppClassLoader.java:581)
>               at 
> org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:484)
>               ... 60 more
> MultiException stack 2 of 2
> java.lang.IllegalArgumentException: Errors were discovered while reifying 
> SystemDescriptor(
>       implementation=org.glassfish.jersey.message.internal.DataSourceProvider
>       
> contracts={javax.ws.rs.ext.MessageBodyWriter,javax.ws.rs.ext.MessageBodyReader}
>       scope=javax.inject.Singleton
>       qualifiers={}
>       descriptorType=CLASS
>       descriptorVisibility=NORMAL
>       metadata=
>       rank=0
>       loader=null
>       proxiable=null
>       proxyForSameScope=null
>       analysisName=null
>       id=91
>       locatorId=1
>       identityHashCode=1840961605
>       reified=false)
>       at 
> org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:681)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:442)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.narrow(ServiceLocatorImpl.java:2300)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.access$1200(ServiceLocatorImpl.java:106)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl$10.compute(ServiceLocatorImpl.java:1385)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl$10.compute(ServiceLocatorImpl.java:1380)
>       at 
> org.glassfish.hk2.utilities.cache.internal.WeakCARCacheImpl.compute(WeakCARCacheImpl.java:105)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetAllServiceHandles(ServiceLocatorImpl.java:1442)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.getAllServiceHandles(ServiceLocatorImpl.java:1368)
>       at 
> org.jvnet.hk2.internal.ServiceLocatorImpl.getAllServiceHandles(ServiceLocatorImpl.java:1356)
>       at 
> org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.getAllServiceHolders(AbstractHk2InjectionManager.java:135)
>       at 
> org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager.getAllServiceHolders(ImmediateHk2InjectionManager.java:30)
>       at 
> org.glassfish.jersey.internal.inject.Providers.getServiceHolders(Providers.java:307)
>       at 
> org.glassfish.jersey.internal.inject.Providers.getCustomProviders(Providers.java:151)
>       at 
> org.glassfish.jersey.message.internal.MessageBodyFactory.initialize(MessageBodyFactory.java:219)
>       at 
> org.glassfish.jersey.message.internal.MessageBodyFactory$MessageBodyWorkersConfigurator.postInit(MessageBodyFactory.java:114)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$2(ApplicationHandler.java:353)
>       at java.base/java.util.Arrays$ArrayList.forEach(Unknown Source)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:353)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:297)
>       at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
>       at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
>       at 
> org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:296)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:261)
>       at 
> org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:236)
>       at org.apache.solr.core.SolrCore.lambda$new$2(SolrCore.java:1158)
>       at 
> org.apache.solr.jersey.JerseyAppHandlerCache.lambda$computeIfAbsent$0(JerseyAppHandlerCache.java:53)
>       at 
> com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$doComputeIfAbsent$14(BoundedLocalCache.java:2688)
>       at java.base/java.util.concurrent.ConcurrentHashMap.compute(Unknown 
> Source)
>       at 
> com.github.benmanes.caffeine.cache.BoundedLocalCache.doComputeIfAbsent(BoundedLocalCache.java:2686)
>       at 
> com.github.benmanes.caffeine.cache.BoundedLocalCache.computeIfAbsent(BoundedLocalCache.java:2669)
>       at 
> com.github.benmanes.caffeine.cache.LocalCache.computeIfAbsent(LocalCache.java:112)
>       at 
> com.github.benmanes.caffeine.cache.LocalManualCache.get(LocalManualCache.java:62)
>       at 
> org.apache.solr.jersey.JerseyAppHandlerCache.computeIfAbsent(JerseyAppHandlerCache.java:53)
>       at org.apache.solr.core.SolrCore.<init>(SolrCore.java:1151)
>       at org.apache.solr.core.SolrCore.<init>(SolrCore.java:1056)
>       at 
> org.apache.solr.core.CoreContainer.createFromDescriptor(CoreContainer.java:1705)
>       at org.apache.solr.core.CoreContainer.lambda$loadInternal$12(CoreCon...
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@solr.apache.org
For additional commands, e-mail: issues-h...@solr.apache.org

Reply via email to