Я ищу способ получить список всех имен ресурсов из данного каталога classpath, что-то вроде метода List<String> getResourceNames (String directoryName).
Например, для заданного каталога classpath, x/y/z содержащего файлы a.html, b.html, c.html и подкаталог d, getResourceNames("x/y/z") должен быть возвращен a List<String> содержащий следующие строки:['a.html', 'b.html', 'c.html', 'd'].
Это должно работать как для ресурсов в файловой системе, так и для jars.
Я знаю, что могу написать быстрый фрагмент с помощью Files, JarFiles и URLs, но я не хочу изобретать велосипед. Мой вопрос в том, что, учитывая существующие общедоступные библиотеки, какой самый быстрый способ реализоватьgetResourceNames? Возможны как стеки Spring, так и Apache Commons.
Другие методы могут быть медленными во время выполнения при огромных значениях CLASSPATH. Более быстрое решение - использовать Reflections API от ronmamo, который выполняет предварительную компиляцию поиска во время компиляции.
/** * list resources available from the classpath @ * */ publicclassResourceList{
/** * for all elements of java.class.path get a Collection of resources Pattern * pattern = Pattern.compile(".*"); gets all resources * * @param pattern * the pattern to match * @return the resources in the order they are found */ publicstatic Collection<String> getResources( final Pattern pattern){ final ArrayList<String> retval = newArrayList<String>(); finalStringclassPath= System.getProperty("java.class.path", "."); final String[] classPathElements = classPath.split(System.getProperty("path.separator")); for(final String element : classPathElements){ retval.addAll(getResources(element, pattern)); } return retval; }
privatestatic Collection<String> getResources( final String element, final Pattern pattern){ final ArrayList<String> retval = newArrayList<String>(); finalFilefile=newFile(element); if(file.isDirectory()){ retval.addAll(getResourcesFromDirectory(file, pattern)); } else{ retval.addAll(getResourcesFromJarFile(file, pattern)); } return retval; }
/** * list the resources that match args[0] * * @param args * args[0] is the pattern to match, or list all resources if * there are no args */ publicstaticvoidmain(final String[] args){ Pattern pattern; if(args.length < 1){ pattern = Pattern.compile(".*"); } else{ pattern = Pattern.compile(args[0]); } final Collection<String> list = ResourceList.getResources(pattern); for(final String name : list){ System.out.println(name); } } }
Этот ответ был написан в 2015 году и, вероятно, использовал Reflections 0.9.10. Впоследствии я пробовал более поздние версии библиотеки Reflections и изо всех сил пытался заставить этот ответ работать. Я также изо всех сил пытался заставить работать примеры из их собственной документации... Лично я не уверен, что делают разработчики проекта... Возможно, это ошибка с моей стороны.