问题描述
A模块引用了B模块
java
@ComponentScan(
basePackages = {"com.moduleA", "com.moduleB", com.moduleB.util"},
excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {A.class})
}
)
java
mvn install
[ERROR] A.class不存在
常见原因分析
模块依赖未正确定义
父模块的pom.xml未正确声明子模块,或子模块间未通过<dependencies>正确引用。
构建顺序问题
Maven/Gradle未按依赖顺序编译模块,导致被依赖模块未优先编译。
类路径扫描失效
Spring Boot的组件扫描未包含依赖模块的包路径,导致@Component等注解未被识别。
编译时类不可用
@ComponentScan 的 excludeFilters 使用 FilterType.ASSIGNABLE_TYPE 直接引用类,但这些类在编译时可能不可用(即使已声明依赖),导致编译失败
解决方案
解决方案
- 创建自定义过滤器 ClassNameExcludeFilter:通过字符串类名匹配需要排除的类,避免编译时类引用。
- 修改 Application上面的注解:使用 FilterType.CUSTOM 和自定义过滤器。
java
public class ClassNameExcludeFilter implements TypeFilter {
private static final Set<String> EXCLUDED_CLASS_NAMES = new HashSet<>(Arrays.asList(
"*"
));
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {
String className = metadataReader.getClassMetadata().getClassName();
return EXCLUDED_CLASS_NAMES.contains(className);
}
}
检查打包结果
确认依赖模块生成的jar包含编译后的类和资源文件。可通过解压jar或检查target/classes目录验证。
高级调试技巧
- 使用
mvn dependency:tree分析依赖树,排除冲突或缺失。 - 在IDE中检查模块的类路径是否包含依赖模块的输出目录(如
target/classes)。 - 对于Gradle,启用
--debug日志查看详细构建过程。