将ClassPathScanningCandidateComponentProvider与多个jar文件一起使用? [英] Using ClassPathScanningCandidateComponentProvider with multiple jar files?

查看:257
本文介绍了将ClassPathScanningCandidateComponentProvider与多个jar文件一起使用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm looking at using ClassPathScanningCandidateComponentProvider for finding sub-classes of a specific Class in my JVM.

我正在做的几乎完全是这里描述的: 在运行时扫描Java注释

I'm doing pretty much exactly what is described here: Scanning Java annotations at runtime

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

However, when I call the code from ant, via a JMX bean I hit a serious issue.

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

I call: ClassPathScanningCandidateComponentProvider.findCandidateComponents with the search package: "com.mycompany"

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

However, there are multiple jar files in my classpath that contain classes that start with that package. Spring is stopping scanning after the first one is scanned (I know this as if I search for sublasees of java.lang.Object I get all classes in one jar file).

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

Is there a way to tell ClassPathScanningCandidateComponentProvider/Spring not to stop scanning after the first jar ?

干杯

推荐答案

事实证明我必须明确定义ClassLoader,因为当从JMX运行扫描时,它会在不同的加载器上查找类并找不到任何内容

Turns out that I hads to explicitly define the ClassLoader, since when running the scan from JMX, it will look for classes on a different loader and find nothing

//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);

...

这篇关于将ClassPathScanningCandidateComponentProvider与多个jar文件一起使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆