You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ArchUnit classes规则是否支持类似ignoreDependency的依赖忽略方法

问题原因

你遇到的违规是ArchUnit对数组类型的识别机制导致的:JVM中char[]这类数组的内部签名为[C,所有数组类型(包括原始类型数组、引用类型数组)都不属于任何命名包,因此不会匹配你规则中配置的java..等包匹配规则,才会触发误报。
你不需要把规则改写为分层架构形式,使用classes().that()...的Fluent API本身就支持这类依赖的放行配置,有两种常用实现方案:

方案1:直接在允许依赖的条件中增加数组类型放行

这是改动最小的方案,只需要在原有依赖判断逻辑后追加数组类型的匹配条件即可,修改后的规则代码如下:

@ArchTest
private final ArchRule networkPackagesMustNotDependOnOtherPackagesOutsideNetwork = classes().that()
            .resideInAPackage("..onnessium.network.shared..")
            .should().onlyDependOnClassesThat()
            .resideInAnyPackage("..onnessium.network..", "java..", "com.esotericsoftware.kryo..", "com.esotericsoftware.kryonet..")
            // 放行char[]、int[]这类原始类型数组
            .or(JavaClass.Predicates.arePrimitiveArrays())
            // 如果代码中存在String[]、自定义类数组这类引用类型数组,替换为下面的通用数组判断即可
            // .or(JavaClass.Predicates.areArrays())
            ;

数组类型的依赖本质上指向其元素类型,只要元素类型在你允许的依赖包范围内,放行数组本身不会引入违规的跨包依赖风险。

方案2:使用ignoreDependency方法定向忽略依赖

如果你需要更灵活的依赖忽略能力(比如后续还要忽略其他特定类、特定场景的依赖),非分层架构的规则同样支持ignoreDependency方法,你可以把规则改写为否定形式的依赖判断,再追加忽略规则:

@ArchTest
private final ArchRule networkPackagesMustNotDependOnOtherPackagesOutsideNetwork = noClasses()
            .that().resideInAPackage("..onnessium.network.shared..")
            .should().dependOnClassesThat()
            .resideOutsideOfPackages("..onnessium.network..", "java..", "com.esotericsoftware.kryo..", "com.esotericsoftware.kryonet..")
            // 忽略network.shared包下类对所有数组类型的依赖
            .ignoreDependency(
                JavaClass.Predicates.resideInAPackage("..onnessium.network.shared.."),
                JavaClass.Predicates.areArrays()
            );

ignoreDependency接收两个谓词参数,第一个用于匹配依赖发起方,第二个用于匹配被依赖的目标类,你可以根据需要自由组合匹配规则,实现和分层架构规则下完全一致的依赖忽略能力。


内容的提问来源于stack exchange,提问作者Tobias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:54:14