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
相关产品推荐
相关产品推荐

