Skip to content

Commit e9eafce

Browse files
authored
Use context class loader to load modules (#28)
1 parent afcd281 commit e9eafce

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/main/java/com/scalar/kelpie/modules/ModuleLoader.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.scalar.kelpie.modules.dummy.DummyPreProcessor;
77
import com.scalar.kelpie.modules.dummy.DummyProcessor;
88
import java.io.File;
9+
import java.lang.reflect.Method;
910
import java.net.URL;
1011
import java.net.URLClassLoader;
1112
import java.util.ArrayList;
@@ -66,12 +67,16 @@ public List<Injector> loadInjectors() throws ModuleLoadException {
6667

6768
private Module loadModule(String className, String jarPath) throws ModuleLoadException {
6869
try {
69-
URL[] urls = new URL[] {new File(jarPath).toURI().toURL()};
70-
ClassLoader loader = URLClassLoader.newInstance(urls, getClass().getClassLoader());
71-
Class<Module> clazz = (Class<Module>) Class.forName(className, true, loader);
72-
Class[] types = {Config.class};
73-
Object[] args = {config};
70+
URLClassLoader classLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader();
71+
URL jarUrl = new File(jarPath).toURI().toURL();
72+
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
73+
method.setAccessible(true);
74+
method.invoke(classLoader, jarUrl);
7475

76+
@SuppressWarnings("unchecked")
77+
Class<Module> clazz = (Class<Module>) Class.forName(className, true, classLoader);
78+
Class<?>[] types = {Config.class};
79+
Object[] args = {config};
7580
return clazz.getConstructor(types).newInstance(args);
7681
} catch (Exception e) {
7782
throw new ModuleLoadException("Failed to load a module " + className + " from " + jarPath, e);

0 commit comments

Comments
 (0)