使用ArchUnit时如何忽略静态依赖以通过分层依赖校验
ArchUnit 排除静态导入的依赖校验实现
内置API实现(推荐,ArchUnit 0.14+ 版本支持)
直接调用ArchUnit提供的ignoreDependenciesThatAreStaticImports()流式方法,即可一键排除所有静态导入的依赖校验:
import com.tngtech.archunit.lang.ArchRule; import org.junit.Test; import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; public class LayerDependencyTest { @Test public void presentation_layer_should_only_depend_on_service_layer() { ArchRule rule = classes() // 匹配展示层所有类 .that().resideInAPackage("com.your.project.presentation..") .should().onlyDependOnClassesThat() // 匹配允许依赖的服务层类 .resideInAPackage("com.your.project.service..") // 核心逻辑:排除所有静态导入的依赖 .ignoreDependenciesThatAreStaticImports(); rule.check(yourArchClasses); } }
自定义过滤逻辑实现(兼容低版本/细粒度控制场景)
如果使用低于0.14的ArchUnit版本,或者需要只排除特定类型的静态导入,可以通过ignoreDependency自定义过滤规则:
import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.domain.StaticReferenceAccess; import com.tngtech.archunit.lang.ArchRule; import org.junit.Test; import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; public class LayerDependencyTest { @Test public void presentation_layer_should_only_depend_on_service_layer() { ArchRule rule = classes() .that().resideInAPackage("com.your.project.presentation..") .should().onlyDependOnClassesThat() .resideInAPackage("com.your.project.service..") // 自定义过滤:仅排除静态导入的依赖 .ignoreDependency((JavaClass origin, JavaClass target) -> origin.getAccessesToTarget(target).stream() .anyMatch(access -> access instanceof StaticReferenceAccess) ); rule.check(yourArchClasses); } }
额外说明
- 你可以在
onlyDependOnClassesThat的规则中额外添加or(resideInAPackage("java.."))等匹配规则,放行JDK内置类、公共工具类等合法依赖,避免误校验。 - 若需要只排除常量类的静态导入,可在自定义过滤逻辑中额外增加对target类的判断,比如
target.getSimpleName().endsWith("Constants")。
内容的提问来源于stack exchange,提问作者HellishHeat
相关产品推荐
相关产品推荐

