/** * Convenience class to construct a classloader for a program from an unpacked jar directory. * Adds <unpackedJarDir>/{.,*.jar,lib/*.jar} to the {@link java.net.URLClassLoader}. * * @param unpackedJarDir Directory of the unpacked jar to be used in the classpath. * @param parentDelegate Parent classloader. */ public ProgramClassLoader(File unpackedJarDir, ClassLoader parentDelegate) { super(getClassPathUrls(unpackedJarDir), parentDelegate); }
private static URL[] getClassPathUrls(File unpackedJarDir) { List<URL> classPathUrls = new LinkedList<URL>(); try { classPathUrls.add(unpackedJarDir.toURI().toURL()); } catch (MalformedURLException e) { LOG.error("Error in adding unpackedJarDir to classPathUrls", e); } try { classPathUrls.addAll(getJarURLs(unpackedJarDir)); } catch (MalformedURLException e) { LOG.error("Error in adding jar URLs to classPathUrls", e); } try { classPathUrls.addAll(getJarURLs(new File(unpackedJarDir, "lib"))); } catch (MalformedURLException e) { LOG.error("Error in adding jar URLs to classPathUrls", e); } return classPathUrls.toArray(new URL[classPathUrls.size()]); }
public static ProgramClassLoader newProgramClassLoader(File unpackedJarDir, Iterable<String> apiResourceList) throws IOException { Predicate<String> predicate = Predicates.in(Sets.newHashSet(apiResourceList)); ClassLoader filterParent = Objects.firstNonNull(Thread.currentThread().getContextClassLoader(), ClassLoaders.class.getClassLoader()); return new ProgramClassLoader(unpackedJarDir, new FilterClassLoader(predicate, filterParent)); }
public Program createProgram(File jarPath, String classToLoad, File jarUnpackDir) throws Exception { expandJar(jarPath, jarUnpackDir); ProgramClassLoader classLoader = ClassLoaders.newProgramClassLoader(jarUnpackDir, ApiResourceListHolder.getResourceList()); Class<?> clz = classLoader.loadClass(classToLoad); if (!(clz.newInstance() instanceof Flow)) { throw new Exception("Expected Flow class"); } ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(classLoader); Location deployJar = jarForTestBase(clz); LOG.info("Deploy Jar location : {}", deployJar.toURI()); try { return Programs.create(deployJar, classLoader); } finally { Thread.currentThread().setContextClassLoader(contextClassLoader); } }