将ClassPathScanningCandidateComponentProvider与多个jar文件一起使用?

时间:2012-01-10 17:09:44

标签: java spring classloader

我正在使用ClassPathScanningCandidateComponentProvider在我的JVM中查找特定类的子类。

我正在做的几乎就是这里描述的内容:Scanning Java annotations at runtime

然而,当我从ant调用代码时,通过JMX bean我遇到了一个严重的问题。

我用搜索包调用:ClassPathScanningCandidateComponentProvider.findCandidateComponents:“com.mycompany”

但是,我的类路径中有多个jar文件包含以该包开头的类。扫描完第一个后,Spring正在停止扫描(我知道这就像搜索java.lang.Object的子类一样。我在一个jar文件中得到所有类。)

有没有办法告诉ClassPathScanningCandidateComponentProvider / Spring在第一个jar后不要停止扫描?

干杯

1 个答案:

答案 0 :(得分:11)

事实证明我必须明确定义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);

...