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

如何在ArchUnit分层架构测试中排除Java基础功能依赖?

解决ArchUnit分层架构规则排除Java基础类的方法

你可以通过两种方式解决这个问题,要么直接忽略JDK基础包的依赖检查,要么只关注自定义分层之间的依赖关系:

方法一:忽略JDK基础包的依赖

在测试代码中添加ignoreDependency规则,排除对java.*、javax.*等JDK核心包的依赖检查:

@Test
void layeredArchitectureTest() {
    Architectures.layeredArchitecture()
            .consideringAllDependencies()
            // 忽略所有JDK基础包的依赖
            .ignoreDependency(packageMatches("java..*"), any())
            .ignoreDependency(any(), packageMatches("java..*"))
            .ignoreDependency(packageMatches("javax..*"), any())
            .ignoreDependency(any(), packageMatches("javax..*"))
            .layer("Presentation").definedBy(PACKAGE_PREFIX + ".presentation..")
            .layer("Service").definedBy(PACKAGE_PREFIX + ".service..")
            .layer("Domain").definedBy(PACKAGE_PREFIX + ".domain..")
            .layer("Infrastructure").definedBy(PACKAGE_PREFIX + ".infrastructure..")
            .whereLayer("Presentation").mayOnlyAccessLayers("Service", "Domain", "Infrastructure")
            .whereLayer("Infrastructure").mayOnlyBeAccessedByLayers("Service", "Domain", "Presentation")
            .whereLayer("Service").mayOnlyAccessLayers("Domain", "Infrastructure")
            .whereLayer("Domain").mayNotAccessAnyLayer()
            .check(classes);
}

packageMatches("java..*")会匹配所有java开头的子包(包括java.util、java.lang等),ArchUnit将不再检查这些包的依赖是否符合分层规则。

方法二:只检查自定义分层间的依赖

如果你的规则仅需要约束自己定义的四个分层,把consideringAllDependencies替换为consideringOnlyDependenciesInLayers,这样ArchUnit会自动忽略所有外部包(包括JDK)的依赖,只关注你定义的层内部和层之间的关系:

@Test
void layeredArchitectureTest() {
    Architectures.layeredArchitecture()
            .consideringOnlyDependenciesInLayers() // 替换原有的consideringAllDependencies
            .layer("Presentation").definedBy(PACKAGE_PREFIX + ".presentation..")
            .layer("Service").definedBy(PACKAGE_PREFIX + ".service..")
            .layer("Domain").definedBy(PACKAGE_PREFIX + ".domain..")
            .layer("Infrastructure").definedBy(PACKAGE_PREFIX + ".infrastructure..")
            .whereLayer("Presentation").mayOnlyAccessLayers("Service", "Domain", "Infrastructure")
            .whereLayer("Infrastructure").mayOnlyBeAccessedByLayers("Service", "Domain", "Presentation")
            .whereLayer("Service").mayOnlyAccessLayers("Domain", "Infrastructure")
            .whereLayer("Domain").mayNotAccessAnyLayer()
            .check(classes);
}

这种方式更简洁,适合不需要关心外部依赖约束的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:33:33