|
6 | 6 | import com.scalar.kelpie.modules.dummy.DummyPreProcessor; |
7 | 7 | import com.scalar.kelpie.modules.dummy.DummyProcessor; |
8 | 8 | import java.io.File; |
| 9 | +import java.lang.reflect.Method; |
9 | 10 | import java.net.URL; |
10 | 11 | import java.net.URLClassLoader; |
11 | 12 | import java.util.ArrayList; |
@@ -66,12 +67,16 @@ public List<Injector> loadInjectors() throws ModuleLoadException { |
66 | 67 |
|
67 | 68 | private Module loadModule(String className, String jarPath) throws ModuleLoadException { |
68 | 69 | 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); |
74 | 75 |
|
| 76 | + @SuppressWarnings("unchecked") |
| 77 | + Class<Module> clazz = (Class<Module>) Class.forName(className, true, classLoader); |
| 78 | + Class<?>[] types = {Config.class}; |
| 79 | + Object[] args = {config}; |
75 | 80 | return clazz.getConstructor(types).newInstance(args); |
76 | 81 | } catch (Exception e) { |
77 | 82 | throw new ModuleLoadException("Failed to load a module " + className + " from " + jarPath, e); |
|
0 commit comments