Uwe Schindler created LUCENE-7873:
-------------------------------------
Summary: Remove context classloader from SPI lookups by default
Key: LUCENE-7873
URL: https://issues.apache.org/jira/browse/LUCENE-7873
Project: Lucene - Core
Issue Type: Improvement
Components: core/other
Reporter: Uwe Schindler
Assignee: Uwe Schindler
Fix For: master (7.0)
As discussed on LUCENE-7870, we should really remove the context class loader
from Lucene's SPI lookup (NamedSPLoader, SPIClassIterator, AnalysisSPI stuff).
{quote}
My idea would be (as stated before): Get rid of the Context Classloader in SPI
lookups! Lucene never uses it, it is just there for backwards compatibility.
The current setup of SPI does not work with modules of Java 9 and it does not
work with stuff in completely different classloaders. So OSGI fails in any
case, if you have lucene-core.jar and lucene-backwards-codecs.jar as OSGI
modules, because both would use different loaders. The context loader won't
help.
The problem is that we may break some apps that rely on the context loader
traversal. In my opinion, we may add a system property that is read on setup of
NamedSPILoader / SPIClassIterator that can be set to true (e.g.
lucene.useContextLoaderForSPI, defaulting to false). This may fix legacy apps
and new apps would only traverse the classloader that loaded lucene-core.jar.
For Java 9 and "Lucene as Java 9 module") we have to refactor this anyways,
becaue we need to respect module-info,java and look for SPI exports.
FYI: Context class loaders were the worst idea ever in Java. I personally hate
them and I would do anything - just to make them disappear from the spec! When
drinking beers with Mark Reinhold in Brussels, I am always reminding him about
this together with the inability to unmap byte buffers... :-)
{quote}
Unfortunately the sysprop approach is the only way to handle this as this must
be done very early on JVM/Lucene setup. If somebody called Codec.forName() its
too late to change the default... But I am fine with using a sysprop with
AccessController.doPrivileged(), as this is only required for those legacy
WEBAPP stuff. Normal applications should see the META-INF files on the
application classloader anyways.
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]