Я бы, вероятно, использовал два правила.
@ArchTest
final ArchRule fooShouldNotDependOnBar = ArchRuleDefinition
.classes()
.that().resideInAnyPackage("com.myapp.foo")
.should().onlyDependOnClassesThat()
.resideOutsideOfPackage("com.myapp.bar");
@ArchTest
final ArchRule barShouldNotDependOnFoo = ArchRuleDefinition
.classes()
.that().resideInAnyPackage("com.myapp.bar")
.should().onlyDependOnClassesThat()
.resideOutsideOfPackage("com.myapp.foo");
Если вы хотите написать то же самое в одном правиле без пользовательских классов, должно работать следующее.Я не уверен, если бы я назвал это элегантным , так как это кажется немного сложным.Возможно, есть лучшие способы записать его в одном правиле.
@ArchTest
final ArchRule packagesFooAndBarNotDependOnEachOther = SlicesRuleDefinition
.slices()
.matching("com.myapp.(*)")
.should()
.notDependOnEachOther()
.ignoreDependency(
JavaClass.Predicates.resideOutsideOfPackages("com.myapp.foo", "com.myapp.bar"),
DescribedPredicate.alwaysTrue())
.ignoreDependency(
DescribedPredicate.alwaysTrue(),
JavaClass.Predicates.resideOutsideOfPackages("com.myapp.foo", "com.myapp.bar"))
);
Правило сначала соответствует всем прямым подпакетам com.myapp
.Первый ignoreDependency
затем исключает все зависимости из классов вне заданных пакетов (например, для com.myapp.xx
доступа com.myapp.foo
).Второй ignoreDependency
исключает все зависимости из данных пакетов для любого внешнего пакета (например, для com.myapp.foo
доступа com.myapp.xx
).