在 ArchUnit 中为分层架构创建规则时,我不清楚如何排除单个类(Main)。 基本示例排除了源和目标。
...但我不明白它如何转化为我的需要。我只想忽略 Main 。为什么?因为 Main 引用了所有层,因为它注入了所有依赖项。
原始代码 与失败的测试一起在我的 GitHub 中。(该项目是一个虚拟项目,因此运行起来很简单;只需克隆它,运行测试并看到一个失败)。
假设您已经导入了所有类:
JavaClasses classes = new ClassFileImporter().importPackages("org.example");
然后,您通常会根据 ArchRule 检查所有这些类,无论它是类规则还是体系结构规则:
ArchRule rule = classes()
.that().areAnnotatedWith(Service.class)
.should().haveSimpleNameEndingWith("Service");
rule.check(classes);
要从规则中排除类,您可以过滤classes
并将过滤JavaClasses
后的内容传递给规则:
import static com.tngtech.archunit.base.DescribedPredicate.not;
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.equivalentTo;
import static com.tngtech.archunit.lang.conditions.ArchPredicates.are;
JavaClasses allExceptMain = classes.that(are(not(equivalentTo(Main.class))));
rule.check(allExceptMain);
要排除在(内部类、匿名类、lambda 等)内部Main
定义的类和所有类,Main
您可以调整过滤器:
import static com.tngtech.archunit.base.DescribedPredicate.not;
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.belongToAnyOf;
JavaClasses allExceptMain = classes.that(not(belongToAnyOf(Main.class)));
rule.check(allExceptMain);
像这样的东西怎么样:
.ignoreDependency(fullNameMatching("users.WebAppConfig"), alwaysTrue())
另一种可能性是将负责启动应用程序(“用户”包)的源代码部分显式声明为真正的层并将其集成到您的规则中。毕竟,这就是您希望源代码工作的方式,所以我想知道是否将其设为异常是要走的路。