Index: analysis/common/src/java/org/apache/lucene/analysis/util/AnalysisSPILoader.java =================================================================== --- analysis/common/src/java/org/apache/lucene/analysis/util/AnalysisSPILoader.java (revision 1455482) +++ analysis/common/src/java/org/apache/lucene/analysis/util/AnalysisSPILoader.java (working copy) @@ -52,6 +52,10 @@ public AnalysisSPILoader(Class clazz, String[] suffixes, ClassLoader classloader) { this.clazz = clazz; this.suffixes = suffixes; + // if clazz' classloader is not a parent of the given one, we scan clazz's classloader, too: + if (classloader != null && !SPIClassIterator.isParentClassLoader(clazz.getClassLoader(), classloader)) { + reload(clazz.getClassLoader()); + } reload(classloader); } @@ -67,6 +71,9 @@ * of new service providers on the given classpath/classloader! */ public synchronized void reload(ClassLoader classloader) { + if(classloader == null) { + classloader = clazz.getClassLoader(); + } final LinkedHashMap> services = new LinkedHashMap>(this.services); final SPIClassIterator loader = SPIClassIterator.get(clazz, classloader); Index: core/src/java/org/apache/lucene/util/NamedSPILoader.java =================================================================== --- core/src/java/org/apache/lucene/util/NamedSPILoader.java (revision 1455482) +++ core/src/java/org/apache/lucene/util/NamedSPILoader.java (working copy) @@ -39,6 +39,10 @@ public NamedSPILoader(Class clazz, ClassLoader classloader) { this.clazz = clazz; + // if clazz' classloader is not a parent of the given one, we scan clazz's classloader, too: + if (classloader != null && !SPIClassIterator.isParentClassLoader(clazz.getClassLoader(), classloader)) { + reload(clazz.getClassLoader()); + } reload(classloader); } @@ -54,6 +58,9 @@ * of new service providers on the given classpath/classloader! */ public synchronized void reload(ClassLoader classloader) { + if(classloader == null) { + classloader = clazz.getClassLoader(); + } final LinkedHashMap services = new LinkedHashMap(this.services); final SPIClassIterator loader = SPIClassIterator.get(clazz, classloader); while (loader.hasNext()) { Index: core/src/java/org/apache/lucene/util/SPIClassIterator.java =================================================================== --- core/src/java/org/apache/lucene/util/SPIClassIterator.java (revision 1455482) +++ core/src/java/org/apache/lucene/util/SPIClassIterator.java (working copy) @@ -53,6 +53,23 @@ public static SPIClassIterator get(Class clazz, ClassLoader loader) { return new SPIClassIterator(clazz, loader); } + + /** + * Utility method to check if some class loader is a (grand-)parent of or the same as another one. + * This means the child will be able to load all classes from the parent, too. + */ + public static boolean isParentClassLoader(final ClassLoader parent, ClassLoader child) { + if (parent == null) { + return false; + } + while (child != null) { + if (child == parent) { + return true; + } + child = child.getParent(); + } + return false; + } private SPIClassIterator(Class clazz, ClassLoader loader) { if (loader == null)