Использование ClassPathScanningCandidateComponentProvider с несколькими файлами JAR? - PullRequest
7 голосов
/ 10 января 2012

Я смотрю на использование ClassPathScanningCandidateComponentProvider для поиска подклассов определенного класса в моей JVM.

Я делаю в значительной степени именно то, что описано здесь: Сканирование аннотаций Java во время выполнения

Однако, когда я вызываю код из ant, через бин JMX я сталкиваюсь с серьезной проблемой.

Я вызываю: ClassPathScanningCandidateComponentProvider.findCandidateComponents с пакетом поиска: "com.mycompany"

Однако в моем пути к классам есть несколько jar-файлов, которые содержат классы, которые начинаются с этого пакета.Spring прекращает сканирование после того, как сканируется первый (я знаю это так, как будто я ищу подклассы java.lang. Объект я получаю все классы в одном файле jar).

Есть ли способ сообщить ClassPathScanningCandidateComponentProvider /Пружина, чтобы не прекращать сканирование после первой банки?

Ура

1 Ответ

11 голосов
/ 18 января 2012

Оказывается, мне пришлось явно определить ClassLoader, так как при запуске сканирования из JMX он будет искать классы на другом загрузчике и ничего не найдет

//Add that at top of class
private static final ClassLoader classLoader = MyClass.class.getClassLoader();

...

ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider( true);

provider.addIncludeFilter(new AssignableTypeFilter(forClass));

//Had to add this line
provider.setResourceLoader(new PathMatchingResourcePatternResolver(classLoader));

final Set<BeanDefinition> candidates = provider.findCandidateComponents(SEARCH_PACKAGE);

...
...