Forum Discussion
DKorkchi
15 years agoNew Contributor
They are included in an uber-jar (created with Maven shade plugin). Then the resulting jar is "deployed" through a class in the .aar package by using the system classloader. Here's the code snippet:
public static Class<?> loadClassFromJar(String path, String className)
{
Class<?> c = null;
try {
URL url = new URL("jar:file://" + path + "!/");
URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
URL[] urls = sysLoader.getURLs();
for (int i = 0; i < urls.length; i++) {
if (urls.toString().equalsIgnoreCase(url.toString())) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, "URL " + url + " is already in the CLASSPATH");
System.out.println();
}
}
Class sysclass = URLClassLoader.class;
Method method = sysclass.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
Object invoke = method.invoke(sysLoader, new Object[]{url});
ClassLoader loader = URLClassLoader.newInstance(new URL[]{url}, JarClassLoader.class.getClassLoader());
if(className != null)
c = Class.forName(className, true, loader);
} catch (ClassNotFoundException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (NoSuchMethodException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (MalformedURLException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
}
return c;
}
I don't receive any ClassLoader errors though.
public static Class<?> loadClassFromJar(String path, String className)
{
Class<?> c = null;
try {
URL url = new URL("jar:file://" + path + "!/");
URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
URL[] urls = sysLoader.getURLs();
for (int i = 0; i < urls.length; i++) {
if (urls.toString().equalsIgnoreCase(url.toString())) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, "URL " + url + " is already in the CLASSPATH");
System.out.println();
}
}
Class sysclass = URLClassLoader.class;
Method method = sysclass.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
Object invoke = method.invoke(sysLoader, new Object[]{url});
ClassLoader loader = URLClassLoader.newInstance(new URL[]{url}, JarClassLoader.class.getClassLoader());
if(className != null)
c = Class.forName(className, true, loader);
} catch (ClassNotFoundException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (NoSuchMethodException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
} catch (MalformedURLException ex) {
Logger.getLogger(JarClassLoader.class.getName()).log(Level.FATAL, null, ex);
}
return c;
}
I don't receive any ClassLoader errors though.