1

我正在使用反射来查找某个包中的所有目录,然后将这些目录作为 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 ,但似乎无法将此条目转换为文件...

4

2 回答 2

1

期望您能够将您从中获得的所有东西都视为#getResources(String)有效File参考是错误的。在您的运行案例中,它是您的应用程序/库的 Jar 中文件的引用。您应该这样访问这些URLs:在它们上获取InputStreams( URL#openStream) 以读取内容,而不是尝试跳过s File

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

于 2012-05-16T09:47:16.903 回答
0

您可以java.util.zip.ZipFile在指向 jar 文件内部时使用。只需将引用的 jar 文件加载到 a 中ZipFile并使用getEntryorentries来检索 jar 中的元素。

于 2012-05-16T09:57:51.663 回答