如果我想使某个 Java 包免受 ArchUnit 的第 3 方依赖,我该怎么做?
更具体地说,我正在考虑将我的域模型保持在六边形架构中,不受 Spring 代码的影响。我指定了一些我认为应该阻止模型使用 spring 的规则。但是,我可以使用 @Component
和 @Bean
等 Spring 注释,而不会造成违规。
到目前为止我尝试过的是
layeredArchitecture().
layer("domain").definedBy(DOMAIN_LAYER).
layer("application").definedBy(APPLICATION_LAYER).
layer("primary-adapters").definedBy(PRIMARY_ADAPTERS).
layer("secondary-adapters").definedBy(SECONDARY_ADAPTERS).
layer("spring").definedBy("org.springframework..")
whereLayer("spring").mayOnlyBeAccessedByLayers("primary-adapters", "secondary-adapters", "application").
because("Domain should be kept spring-free").
check(CLASSES);
还有
noClasses().that().resideInAPackage(DOMAIN_LAYER).
should().dependOnClassesThat().resideInAPackage("org.springframework..").
check(CLASSES);
noClasses().that().resideInAPackage(DOMAIN_LAYER).
should().accessClassesThat().resideInAPackage("org.springframework..").
check(CLASSES);
Here尽管 com.example.app.domain.Factory
正在导入 org.springframework...
,但执行测试效果很好的代码示例。
最佳答案
您可以使用DescribedPredicate:
void domainSpring() {
DescribedPredicate<JavaAnnotation> springAnnotationPredicate = new DescribedPredicate<JavaAnnotation>("Spring filter") {
@Override
public boolean apply(JavaAnnotation input) {
return input.getType().getPackageName().startsWith("org.springframework");
}
};
classes().that().resideInAPackage(DOMAIN_LAYER).should()
.notBeAnnotatedWith(springAnnotationPredicate).check(CLASSES);
}
关于java - 如何防止某些包在 ArchUnit 中使用 spring?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53787810/