in storm-client/src/jvm/org/apache/storm/utils/Utils.java [1692:1757]
public static Map<String, Object> getConfigFromClasspath(List<String> cp, Map<String, Object> conf) throws IOException {
if (cp == null || cp.isEmpty()) {
return conf;
}
Yaml yaml = new Yaml(new SafeConstructor(new LoaderOptions()));
Map<String, Object> defaultsConf = null;
Map<String, Object> stormConf = null;
// Based on how Java handles the classpath
// https://docs.oracle.com/javase/8/docs/technotes/tools/unix/classpath.html
for (String part : cp) {
File f = new File(part);
if (f.getName().equals("*")) {
// wildcard is given in file
// in java classpath, '*' is expanded to all jar/JAR files in the directory
File dir = f.getParentFile();
if (dir == null) {
// it happens when part is just '*' rather than denoting some directory
dir = new File(".");
}
File[] jarFiles = dir.listFiles((dir1, name) -> name.endsWith(".jar") || name.endsWith(".JAR"));
// Quoting Javadoc in File.listFiles(FilenameFilter filter):
// Returns {@code null} if this abstract pathname does not denote a directory, or if an I/O error occurs.
// Both things are not expected and should not happen.
if (jarFiles == null) {
throw new IOException("Fail to list jar files in directory: " + dir);
}
for (File jarFile : jarFiles) {
JarConfigReader jarConfigReader = new JarConfigReader(yaml, defaultsConf, stormConf, jarFile).readJar();
defaultsConf = jarConfigReader.getDefaultsConf();
stormConf = jarConfigReader.getStormConf();
}
} else if (f.isDirectory()) {
// no wildcard, directory
if (defaultsConf == null) {
defaultsConf = readConfIgnoreNotFound(yaml, new File(f, "defaults.yaml"));
}
if (stormConf == null) {
stormConf = readConfIgnoreNotFound(yaml, new File(f, "storm.yaml"));
}
} else if (f.isFile()) {
// no wildcard, file
String fileName = f.getName();
if (fileName.endsWith(".zip") || fileName.endsWith(".ZIP")) {
JarConfigReader jarConfigReader = new JarConfigReader(yaml, defaultsConf, stormConf, f).readZip();
defaultsConf = jarConfigReader.getDefaultsConf();
stormConf = jarConfigReader.getStormConf();
} else if (fileName.endsWith(".jar") || fileName.endsWith(".JAR")) {
JarConfigReader jarConfigReader = new JarConfigReader(yaml, defaultsConf, stormConf, f).readJar();
defaultsConf = jarConfigReader.getDefaultsConf();
stormConf = jarConfigReader.getStormConf();
}
// Class path entries that are neither directories nor archives (.zip or JAR files)
// nor the asterisk (*) wildcard character are ignored.
}
}
if (stormConf != null) {
defaultsConf.putAll(stormConf);
}
return defaultsConf;
}