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,7 +52,15 @@ public AnalysisSPILoader(Class clazz, String[] suffixes, ClassLoader classloader) { this.clazz = clazz; this.suffixes = suffixes; - reload(classloader); + if(classloader == null) { + reload(clazz.getClassLoader()); + } else { + // 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: 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,7 +39,15 @@ public NamedSPILoader(Class clazz, ClassLoader classloader) { this.clazz = clazz; - reload(classloader); + if(classloader == null) { + reload(clazz.getClassLoader()); + } else { + // 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: 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)