gpt4 book ai didi

Java:从指向 jar 中目录的非分层 URI 创建文件

转载 作者:太空宇宙 更新时间:2023-11-04 08:14:53 25 4
gpt4 key购买 nike

我使用反射来查找某个包中的所有目录,然后将这些目录作为 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 没有问题:文件:/C:/Marcus/JavaProjects/App/build/prod/classes/com/demo/payload

如何从非分层 URI(例如前面提到的 URI)创建一个指向 App.jar 内有效负载目录的文件?

我可以使用JarURLConnection创建一个指向App.jar本身的JarFile,然后可以获得指向我正在搜索的目录的JarEntry,但似乎无法将此条目转换为文件...

最佳答案

期望您能够处理从 #getResources(String) 获得的所有东西是错误的有效File引用。在您的运行案例中,它是应用程序/库的 Jar 中文件的引用。您应该访问这些 URL像这样: get InputStream s ( URL#openStream ) 来读取内容,而不是尝试跳过 File .

为了得到File s,您需要弄清楚何时查看 jar 内 URL,然后可能从 ZIP 中提取文件(因为 JAR 是 ZIP),以便获得适当的一等公民 File .

关于Java:从指向 jar 中目录的非分层 URI 创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10615832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com