summaryrefslogtreecommitdiffstats
path: root/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/IoUtil.java
diff options
context:
space:
mode:
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.java51
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() {
}
}