package alien4cloud.plugin;
import java.net.URL;
import java.net.URLClassLoader;
import lombok.extern.slf4j.Slf4j;
/**
* Specific classloader for plugins that do not delegates first to the parent classloader.
*/
@Slf4j
public class PluginClassloader extends URLClassLoader {
public PluginClassloader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
Class<?> loadedClass = findLoadedClass(name);
// if the class has not been loaded already the
if (loadedClass == null) {
loadedClass = doLoadClass(name);
}
return loadedClass;
}
private Class<?> doLoadClass(String name) throws ClassNotFoundException {
// some dependencies must should not be resolved by the plugin classloader.
if (name.startsWith("org.slf4j")) {
return super.loadClass(name);
}
// try to resolve locally before delegating to parent.
try {
return findClass(name);
} catch (ClassNotFoundException e) {
if (log.isTraceEnabled()) {
log.trace("Class {} is not found in the plugin - delegating to parent", name);
}
}
return super.loadClass(name);
}
}