2010-11-22 6 views
1

я сделал, как по умолчанию ребенка URLClassLoader, добавлены все мои файлы флягиJava URLClassLoader: findResources возвращает нуль, но loadClass возвращает классы

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/"); 

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

ответ

0

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

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

Похожий вопрос: How do I read all classes from a Java package in the classpath?

Как читать Jar: How do I list the files inside a JAR file?

0

Я не думаю, что findResources() делает то, что вы думаете, что shuld делать. По its API doc:

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

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

+0

findResources(), используемый для поиска всех содержащихся сведений с помощью сканера springframework. Там идет моя строка к этому методу. – Ramil