为何ClassGraph在Wildfly上会扫描到其他部署的类?
解决ClassGraph在Wildfly中扫到其他部署类的问题
为啥会扫到其他部署的类?
Wildfly采用模块化类加载架构,默认情况下ClassGraph会使用服务器级的类加载器,这个加载器的作用域覆盖了整个服务器的所有部署模块,所以会扫描到其他WAR包中的类。
怎么只扫自己的WAR?
核心就是让ClassGraph仅使用当前WAR专属的类加载器,步骤如下:
- 获取当前WAR的专属类加载器:你编写扫描代码的那个类,它的类加载器就是当前Wildfly部署模块独有的,直接通过
你的类名.class.getClassLoader()获取即可。 - 配置ClassGraph使用该加载器:用
overrideClassLoaders()方法替换默认的类加载器集合,确保扫描范围仅限当前WAR的类资源。
修改后的代码示例
// 替换成你实际执行扫描逻辑的类的Class对象 ClassLoader myWarClassLoader = YourScanningClass.class.getClassLoader(); try (ScanResult scanResult = new ClassGraph() .enableAllInfo() .whitelistPackages(PACKAGE) // 关键配置:仅使用当前WAR的类加载器扫描 .overrideClassLoaders(myWarClassLoader) .scan()) { final ClassInfoList classesWithAnnotation = scanResult.getClassesWithAnnotation(ApplicationPath.class.getName()); }
额外验证建议
- 如果仍有问题,可以配合
.blacklistPackages()排除Wildfly核心包或其他已知外部包,但优先通过类加载器限制范围更可靠。 - 确认
PACKAGE变量是你自身WAR的专属包路径,避免使用过于宽泛的公共包导致误扫。
内容的提问来源于stack exchange,提问作者Mariusz
相关产品推荐
相关产品推荐

