diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/ServiceProviderExtensionFinder.java b/pf4j/src/main/java/ro/fortsoft/pf4j/ServiceProviderExtensionFinder.java index 05c9cb4..95bf879 100644 --- a/pf4j/src/main/java/ro/fortsoft/pf4j/ServiceProviderExtensionFinder.java +++ b/pf4j/src/main/java/ro/fortsoft/pf4j/ServiceProviderExtensionFinder.java @@ -25,11 +25,10 @@ import java.io.IOException; import java.io.Reader; import java.net.URISyntaxException; import java.net.URL; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; /** * The ServiceLoader base implementation for ExtensionFinder. @@ -50,18 +49,26 @@ public class ServiceProviderExtensionFinder extends AbstractExtensionFinder { log.debug("Reading extensions storages from classpath"); Map> result = new LinkedHashMap<>(); - Set bucket = new HashSet<>(); + final Set bucket = new HashSet<>(); try { URL url = getClass().getClassLoader().getResource(getExtensionsResource()); if (url != null) { - File[] files = new File(url.toURI()).listFiles(); - if (files != null) { - for (File file : files) { + Path extensionPath; + if (url.toURI().getScheme().equals("jar")) { + FileSystem fileSystem = FileSystems.newFileSystem(url.toURI(), Collections.emptyMap()); + extensionPath = fileSystem.getPath(getExtensionsResource()); + } else { + extensionPath = Paths.get(url.toURI()); + } + Files.walkFileTree(extensionPath, Collections.emptySet(), 1, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { log.debug("Read '{}'", file); - Reader reader = new FileReader(file); + Reader reader = Files.newBufferedReader(file, StandardCharsets.UTF_8); ServiceProviderExtensionStorage.read(reader, bucket); + return FileVisitResult.CONTINUE; } - } + }); } if (bucket.isEmpty()) {