in tools/cli/src/main/java/org/apache/batchee/cli/command/JobOperatorCommand.java [229:299]
private ClassLoader createLoader(final ClassLoader parent) throws MalformedURLException {
final Collection<URL> urls = new LinkedList<URL>();
if (libs != null) {
final File folder = new File(libs);
if (folder.exists()) {
addFolder(folder, urls);
}
}
// we add libs/*.jar and libs/xxx/*.jar to be able to sort libs but only one level to keep it simple
File resources = null;
File exploded = null;
if (archive != null) {
final File bar = new File(archive);
if (bar.exists()) {
if (bar.isFile()) { // bar to unzip
exploded = new File(work, bar.getName());
} else if (bar.isDirectory()) { // already unpacked
exploded = bar;
} else {
throw new IllegalArgumentException("unsupported archive type for: '" + archive + "'");
}
final File timestamp = new File(exploded, "timestamp.txt");
long ts = Long.MIN_VALUE;
if (exploded.exists()) {
if (timestamp.exists()) {
try {
ts = Long.parseLong(FileUtils.readFileToString(timestamp).trim());
} catch (final IOException e) {
ts = Long.MIN_VALUE;
}
}
}
if (ts == Long.MIN_VALUE || ts < bar.lastModified()) {
explode(bar, exploded, timestamp, bar.lastModified());
}
if (archive.endsWith(".bar") || new File(exploded, "BATCH-INF").exists()) {
// bar archives are split accross 3 folders
addFolder(new File(exploded, "BATCH-INF/classes"), urls);
addFolderIfExist(new File(exploded, "BATCH-INF/lib"), urls);
resources = new File(exploded, "BATCH-INF");
} else if (archive.endsWith(".war") || new File(exploded, "WEB-INF").exists()) {
addFolderIfExist(new File(exploded, "WEB-INF/classes"), urls);
addLibs(new File(exploded, "WEB-INF/lib"), urls);
} else {
throw new IllegalArgumentException("unknown or unsupported archive type: " + archive);
}
} else {
throw new IllegalArgumentException("'" + archive + "' doesn't exist");
}
}
final ClassLoader sharedClassLoader = createSharedClassLoader(parent);
if (libs == null && archive == null) {
return sharedClassLoader;
}
final ChildFirstURLClassLoader classLoader = new ChildFirstURLClassLoader(urls.toArray(new URL[urls.size()]), sharedClassLoader);
if (resources != null && resources.exists()) {
classLoader.addResource(resources);
}
if (exploded != null) {
classLoader.setApplicationFolder(exploded);
}
return classLoader;
}