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



我正在使用反射来查找某个包中的所有目录,然后将这些目录作为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中,并使用其中的getEntryentries来检索 jar 中的元素。

最新更新