1

我作为 UrlClassLoader 的默认子级,添加了我所有的 jar 文件

public void addFile(String path) throws MalformedURLException {
    String urlPath = "jar:file:/" + path + "!/";

    System.out.println("------------------");
    System.out.println("urlPath = " + urlPath);

    URL url = new URL(urlPath);
    System.out.println("url = " + url);
    super.addURL(url);
    System.out.println("g = " + getURLs().length);
    System.out.println("==================");


}

然后我试图从加载器中获取一些类:

System.out.println("cl.loadClass() = " + cl.loadClass("com.company.project.SomeClass"));

它正常返回类。

当我尝试按包查找所有类时:

resources = cl.findResources("com/company/");

它返回空枚举。为什么?

4

2 回答 2

0

Java APIClassLoader不提供枚举包中所有元素的标准方法。由于您使用自己的ClassLoader,因此您可以在其中实现一个函数,该函数在 JAR 中执行自定义搜索。

几个链接。

类似的问题: 如何从类路径中的 Java 包中读取所有类?

如何读取 Jar:如何列出 JAR 文件中的文件?

于 2010-11-22T08:36:56.417 回答
0

我不认为findResources()你认为它应该做的事情。根据其 API 文档

返回一个 URL 枚举,表示 URL 搜索路径上具有指定名称的所有资源。

听起来它根本不会进行前缀匹配(如果您考虑一下,鉴于 HTTP URL,这是不可能做到的)。它可能做的是在所有构建的基本 URL 中查找给定的全名URLClassLoader,所以如果你调用findResources("log4j.properties")并且类加载器已经用 5 个 JAR 构建,其中 3 个log4j.properties在根目录中包含一个文件,那么该方法将返回所有 3。

于 2010-11-22T08:40:34.390 回答