Index: lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AnalysisSPILoader.java =================================================================== --- lucene/analysis/common/src/java/org/apache/lucene/analysis/util/AnalysisSPILoader.java (revision 1455463) +++ lucene/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 (!SPIClassIterator.isParentClassLoader(clazz.getClassLoader(), classloader)) { + reload(clazz.getClassLoader()); + } reload(classloader); } Index: lucene/core/src/java/org/apache/lucene/util/NamedSPILoader.java =================================================================== --- lucene/core/src/java/org/apache/lucene/util/NamedSPILoader.java (revision 1455463) +++ lucene/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 (!SPIClassIterator.isParentClassLoader(clazz.getClassLoader(), classloader)) { + reload(clazz.getClassLoader()); + } reload(classloader); } Index: lucene/core/src/java/org/apache/lucene/util/SPIClassIterator.java =================================================================== --- lucene/core/src/java/org/apache/lucene/util/SPIClassIterator.java (revision 1455463) +++ lucene/core/src/java/org/apache/lucene/util/SPIClassIterator.java (working copy) @@ -54,6 +54,21 @@ 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) throw new IllegalArgumentException("You must provide a ClassLoader.");