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

