5

在 ArchUnit 中为分层架构创建规则时,我不清楚如何排除单个类(Main)。 基本示例排除了源和目标。

...但我不明白它如何转化为我的需要。我只想忽略 Main 。为什么?因为 Main 引用了所有层,因为它注入了所有依赖项。

原始代码 与失败的测试一起在我的 GitHub 中。(该项目是一个虚拟项目,因此运行起来很简单;只需克隆它,运行测试并看到一个失败)。

4

3 回答 3

4

假设您已经导入了所有类:

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);
于 2020-01-10T21:46:29.813 回答
2

像这样的东西怎么样:

.ignoreDependency(fullNameMatching("users.WebAppConfig"), alwaysTrue())
于 2020-01-11T08:41:40.773 回答
0

另一种可能性是将负责启动应用程序(“用户”包)的源代码部分显式声明为真正的层并将其集成到您的规则中。毕竟,这就是您希望源代码工作的方式,所以我想知道是否将其设为异常是要走的路。

于 2020-01-26T11:59:57.553 回答