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

标签 java spring classloader

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

我所做的与此处描述的几乎完全相同:Scanning Java annotations at runtime

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

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

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

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

干杯

最佳答案

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

...

关于java - 将 ClassPathScanningCandidateComponentProvider 与多个 jar 文件一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8807388/

相关文章:

JavaFX 动画折线图

java - 仅使用字符串的动态类加载

java - 在多个 WAR 中访问库的通用接口(interface)——这在 jboss 中可能吗?

java - 从 JaxRS 迁移到 Spring Rest

java - 这个结构线程安全吗?

java - 以编程方式配置的嵌入式 Tomcat 8 应用程序

java - Spring Boot中bean的创建顺序

java - 使用反射加载类时避免 ClassNotFoundException

java - CDI + JPA + EJB + JTA + JSF——使用 PostgreSQL 的 JBoss-Kitchen 示例?

java - 如何为 Spring Kafka Listener 创建集成测试