in log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/ResolverUtil.java [176:246]
public void findInPackage(final Test test, String packageName) {
packageName = packageName.replace('.', '/');
final ClassLoader loader = getClassLoader();
Enumeration<URL> urls;
try {
urls = loader.getResources(packageName);
} catch (final IOException ioe) {
LOGGER.warn("Could not read package: {}", packageName, ioe);
return;
}
while (urls.hasMoreElements()) {
try {
final URL url = urls.nextElement();
final String urlPath = extractPath(url);
LOGGER.info("Scanning for classes in '{}' matching criteria {}", urlPath , test);
// Check for a jar in a war in JBoss
if (VFSZIP.equals(url.getProtocol())) {
final String path = urlPath.substring(0, urlPath.length() - packageName.length() - 2);
final URL newURL = new URL(url.getProtocol(), url.getHost(), path);
@SuppressWarnings("resource")
final JarInputStream stream = new JarInputStream(newURL.openStream());
try {
loadImplementationsInJar(test, packageName, path, stream);
} finally {
close(stream, newURL);
}
} else if (VFS.equals(url.getProtocol())) {
final String containerPath = urlPath.substring(1, urlPath.length() - packageName.length() - 2);
final File containerFile = new File(containerPath);
if (containerFile.exists()) {
if (containerFile.isDirectory()) {
loadImplementationsInDirectory(test, packageName, new File(containerFile, packageName));
} else {
loadImplementationsInJar(test, packageName, containerFile);
}
} else {
// fallback code for Jboss/Wildfly, if the file couldn't be found
// by loading the path as a file, try to read the jar as a stream
final String path = urlPath.substring(0, urlPath.length() - packageName.length() - 2);
final URL newURL = new URL(url.getProtocol(), url.getHost(), path);
try (final InputStream is = newURL.openStream()) {
final JarInputStream jarStream;
if (is instanceof JarInputStream) {
jarStream = (JarInputStream) is;
} else {
jarStream = new JarInputStream(is);
}
loadImplementationsInJar(test, packageName, path, jarStream);
}
}
} else if (BUNDLE_RESOURCE.equals(url.getProtocol())) {
loadImplementationsInBundle(test, packageName);
} else if (JAR.equals(url.getProtocol())) {
loadImplementationsInJar(test, packageName, url);
} else {
final File file = new File(urlPath);
if (file.isDirectory()) {
loadImplementationsInDirectory(test, packageName, file);
} else {
loadImplementationsInJar(test, packageName, file);
}
}
} catch (final IOException | URISyntaxException ioe) {
LOGGER.warn("Could not read entries", ioe);
}
}
}