我有一个java项目,其中包含一个名为 processor
. 这个项目依赖于一个叫做 rules
还有一个叫做 service
. 每个项目都有相同的包模式- my.com.package
.
这个 processor
以及 rules
两个项目都包含用自定义注解注解的类 @Condition
. 注解接口使用 @Retention(RetentionPolicy.RUNTIME)
. 当我扫描带注解的类时 @Condition
从 service
或者 processor
这样地
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
)它只会在项目中的5个类名中找到2个具有注解。
如果我把论点改成 scanner.findCandidateComponents
中的完整包路径 rules
项目( my.com.package.rules
)在扫描时 processor
或者 service
扫描器找不到候选人。如果我使用 my.com.*
作为论据,它只在 processor
项目。
我在这里看到了一个类似的问题,使用classpathscanningcandidatecomponentprovider和多个jar文件?解决方案是将类装入器传递给组件提供程序。我试着让类的类加载器进行扫描并像这样将其传递给提供者
scanner.setResourceLoader(new PathMatchingResourcePatternResolver(classLoader));
对我来说,这并没有改变任何结果。
1条答案
按热度按时间ve7v8dk21#
愚蠢的错误,问题是我的版本不对
rules
在pom中为我的processor
所以它使用的是旧版本的代码。然而这对于从jar中获取的类返回null,因此如果不是从我的工作区中的源代码运行此代码,我会有点担心。