java - 如何防止某些包在 ArchUnit 中使用 spring?
问题描述
如果我想通过ArchUnit使某个 Java 包不受 3rd 方依赖项的影响,我该怎么做?
更具体地说,我正在考虑将我的域模型保持在一个没有弹簧代码的六边形架构中。我指定了一些我认为应该阻止模型使用弹簧的规则。但是,我可以像使用 spring 注释一样@Component
并且@Bean
不会导致违规。
到目前为止我尝试的是
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);
这里的代码示例可以很好地执行测试,尽管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);
}
推荐阅读
- python - 如何通过 Python 函数运行多个键
- php - 将双精度转换为整数时 PHP 不会产生正确的输出
- python - 如何在 Python 3.x 中使用“locals()”绑定与 exec?
- c - gcc -fstack-protector 不抛出错误
- angular - 使用 NPM 将纯 JS 库添加到 Ionic / Angular
- python - 如何使用显式值评估带有索引变量的 SymPy 表达式?
- windows - MinGW 丢失了 boost 文件
- javascript - JavaScript 和 HTML 上的大量数据导致 XAMPP 中的“页面无响应”对话框
- c - 这里的算法发生了什么,代码与C中的递归问题有关?
- android - 如何从 Fresco SimpleDraweeView 获取 gif?