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

如何在ArchUnit测试中全局排除target文件夹?

全局排除ArchUnit分析中的target文件夹(JUnit 5 + ArchUnit 1.1.0)

你可以通过自定义**导入选项(ImportOption)**并全局配置到@AnalyzeClasses注解中,实现一次性排除target文件夹,无需为每个规则单独设置过滤。

实现步骤

1. 自定义排除target的ImportOption

创建一个实现ImportOption接口的内部类(或外部类),通过类文件的磁盘路径判断是否排除:

static class ExcludeTargetFolder implements ImportOption {
    @Override
    public boolean includes(Location location) {
        // 跨平台匹配:排除所有路径包含"/target/"的类文件
        return !location.getPath().contains("/target/");
    }
}

ArchUnit会自动统一路径分隔符为/,所以无需处理Windows的\。

2. 在测试类上全局应用该选项

将自定义的ExcludeTargetFolder配置到@AnalyzeClasses的importOptions参数中,同时指定你的源码根包(缩小分析范围):

import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;
import com.tngtech.archunit.core.importer.ImportOption;
import com.tngtech.archunit.core.importer.Location;
import com.tngtech.archunit.library.GeneralCodingRules;

@AnalyzeClasses(
    packages = "com.yourcompany.yourapp", // 替换为你的源码根包
    importOptions = ArchitectureTests.ExcludeTargetFolder.class
)
public class ArchitectureTests {

    static class ExcludeTargetFolder implements ImportOption {
        @Override
        public boolean includes(Location location) {
            return !location.getPath().contains("/target/");
        }
    }

    // 直接使用ArchUnit内置规则,自动排除target中的类
    @ArchTest
    public final ArchRule no_generic_exceptions = GeneralCodingRules.NO_CLASSES_SHOULD_THROW_GENERIC_EXCEPTIONS;

    @ArchTest
    public final ArchRule no_field_injection = GeneralCodingRules.NO_CLASSES_SHOULD_USE_FIELD_INJECTION;

    // 你的自定义ArchUnit规则...
}

原理说明

  • @AnalyzeClasses是ArchUnit的核心注解,负责指定要分析的类范围,其importOptions参数会全局作用于所有@ArchTest规则。
  • 自定义的ExcludeTargetFolder会在ArchUnit导入类文件时,过滤掉所有存储在target目录下的编译产物,确保规则只分析你的源代码(src/main/java等目录下的类)。

额外优化

  • 尽量精确指定packages参数(比如com.yourcompany.yourapp.service),减少ArchUnit需要扫描的类数量,提升测试执行速度。
  • 如果需要排除多个目录(比如test-output),可以在includes方法中添加多个判断:return !location.getPath().contains("/target/") && !location.getPath().contains("/test-output/");

内容的提问来源于stack exchange,提问作者Robin.S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:43:19