diff options
Diffstat (limited to 'gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/IoUtil.java')
-rw-r--r-- | gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/IoUtil.java | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/IoUtil.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/IoUtil.java index 939885165b..f750748aa5 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/IoUtil.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/IoUtil.java @@ -14,9 +14,19 @@ package com.google.gerrit.pgm.util; +import com.google.common.collect.Sets; + +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Arrays; +import java.util.Set; public final class IoUtil { public static void copyWithThread(final InputStream src, @@ -42,6 +52,47 @@ public final class IoUtil { }.start(); } + public static void loadJARs(File... jars) { + ClassLoader cl = IoUtil.class.getClassLoader(); + if (!(cl instanceof URLClassLoader)) { + throw noAddURL("Not loaded by URLClassLoader", null); + } + @SuppressWarnings("resource") + URLClassLoader urlClassLoader = (URLClassLoader) cl; + + Method addURL; + try { + addURL = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + addURL.setAccessible(true); + } catch (SecurityException e) { + throw noAddURL("Method addURL not available", e); + } catch (NoSuchMethodException e) { + throw noAddURL("Method addURL not available", e); + } + + Set<URL> have = Sets.newHashSet(Arrays.asList(urlClassLoader.getURLs())); + for (File path : jars) { + try { + URL url = path.toURI().toURL(); + if (have.add(url)) { + addURL.invoke(cl, url); + } + } catch (MalformedURLException e) { + throw noAddURL("addURL " + path + " failed", e); + } catch (IllegalArgumentException e) { + throw noAddURL("addURL " + path + " failed", e); + } catch (IllegalAccessException e) { + throw noAddURL("addURL " + path + " failed", e); + } catch (InvocationTargetException e) { + throw noAddURL("addURL " + path + " failed", e.getCause()); + } + } + } + + private static UnsupportedOperationException noAddURL(String m, Throwable why) { + String prefix = "Cannot extend classpath: "; + return new UnsupportedOperationException(prefix + m, why); + } private IoUtil() { } } |