У меня есть проект java, содержащий приложение загрузки весны под названием processor
. Этот проект зависит от проекта под названием rules
и проекта под названием service
. Каждый проект имеет один и тот же шаблон упаковки - my.com.package
.
Проекты processor
и rules
оба содержат классы, аннотированные пользовательской аннотацией @Condition
. Интерфейс аннотации аннотируется @Retention(RetentionPolicy.RUNTIME)
. При сканировании для классов, аннотированных @Condition
из service
или processor
нравится этаClassPathScanningCandidateComponentProvider.findCandidateComponents имеют неправильное имя класса
private ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(
false);
scanner.addIncludeFilter(new AnnotationTypeFilter(Condition.class));
for (BeanDefinition bd : scanner.findCandidateComponents("my.com")) {
try {
Class<?> c = Class.forName(bd.getBeanClassName());
Condition condition = c.getAnnotation(Condition.class);
register(condition);
} catch (ClassNotFoundException | IOException e) {
logger.error(e.getLocalizedMessage());
}
}
Классы снабженными @Condition
в проекте processor
имеют правильное название класса (my.com.package.x.Class
), но классы аннотированные с @Condition
в проекте rules
есть неправильное полное имя класса (my.com.Class
), и он находит только 2 из 5 имен классов в проекте, которые имеют аннотацию.
Если я изменил аргумент на scanner.findCandidateComponents
на полный путь пакета в проекте rules
(my.com.package.rules
) при сканировании либо в processor
, либо в service
сканер не находит кандидатов. Если я использую my.com.*
в качестве аргумента, он находит только кандидатов в проекте processor
.
Я видел аналогичный вопрос здесь Using ClassPathScanningCandidateComponentProvider with multiple jar files?, и решение заключалось в том, чтобы передать загрузчик класса поставщику компонента. Я пытался получать загрузчик классов класса делает сканирование и передать его поставщику, как этот
scanner.setResourceLoader(new PathMatchingResourcePatternResolver(classLoader));
и это не изменило результатов для меня.