我正在使用反射来查找某个包中的所有目录,然后将这些目录作为 java.io.Files 返回,以便我可以从中提取类文件。我获取包中所有目录的方法是:
private static List<File> findDirs(String packageName) throws IOException,
UnsupportedEncodingException, URISyntaxException {
List<File> result = new ArrayList<File>();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration<URL> resources = classLoader.getResources(path);
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
URI uri = resource.toURI();
File f = new File(uri);// this line throws the exception
result.add(f);
}
return result;
}
从源代码运行我的应用程序时,它工作得非常好。但是,一旦我部署并运行它,findDirs 方法就会失败,因为 File 构造函数会抛出 IllegalArgumentsException“URI 不是分层的”。
我已经调试了代码,导致问题的 URI 是:
jar:file:/C:/Program%20Files/apache-activemq-5.5.1/bin/../lib/App.jar!/com/demo/payload
而从源代码运行时,URI 没有问题:
file:/C:/Marcus/JavaProjects/App/build/prod/classes/com/demo/payload
如何从非分层 URI(例如提到的那个)创建指向 App.jar 中的有效负载目录的文件?
我可以创建一个指向 App.jar 本身的 JarFile ,JarURLConnection
然后可以获取一个指向我正在搜索的目录的 JarEntry ,但似乎无法将此条目转换为文件...