java UrlClassLoader: findResources возвращает ноль, но loadClass возвращает классы - PullRequest
1 голос
/ 22 ноября 2010

Я сделал по умолчанию дочерним от 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/");

Возвращает пустое перечисление. Почему?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2010

Я не думаю, что findResources() делает то, что, по вашему мнению, должно делать.Согласно его API doc :

Возвращает перечисление URL-адресов, представляющих все ресурсы в пути поиска URL-адресов с указанным именем.

Это не похоже на совпадение префиксов (а если подумать, это невозможно сделать, учитывая URL-адрес HTTP).Вероятно, он ищет указанное полное имя во всех базовых URL-адресах, с которыми был создан URLClassLoader, поэтому, если вы вызываете findResources("log4j.properties"), а загрузчик классов создан с 5 JAR, 3из которых в корне содержится файл log4j.properties, тогда метод вернет все 3.

0 голосов
/ 22 ноября 2010

API Java ClassLoader не предоставляет стандартного способа перечисления всех элементов в пакете.Поскольку вы используете свой собственный ClassLoader, вы можете реализовать в нем функцию, которая выполняет пользовательский поиск внутри JAR-файлов.

Несколько ссылок.

Аналогичный вопрос: Как мнечитать все классы из пакета Java в classpath?

Как читать Jar: Как мне перечислить файлы в файле JAR?

...