我正在使用反射来查找某个包中的所有目录,然后将这些目录作为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就会失败,因为文件构造函数抛出非法参数异常"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?
我可以创建一个指向应用程序本身的 JarFile .jar使用 JarURLConnection
,然后可以获得指向我正在搜索的目录的 JarEntry,但似乎无法将此条目转换为文件......
期望你能够处理你从#getResources(String)
获得的所有东西都是有效的File
参考是错误的。在您的运行案例中,它是应用程序/库 Jar 中文件的引用。您应该访问这些URL
:获取InputStream
s(URL#openStream
(以读取内容,而不是尝试跳File
。
为了获得File
,您需要弄清楚何时查看jar内URL,然后可能从ZIP中提取文件(因为JAR是ZIP(,以便获得适当的一等公民File
。
只要指向 jar 文件的内部,就可以使用 java.util.zip.ZipFile
。只需将引用的 jar 文件加载到ZipFile
中,并使用其中的getEntry
或entries
来检索 jar 中的元素。