* リンク [#rf823f25] ** 公式ガイド [#r4df79b9] https://www.archunit.org/userguide/html/000_Index.html *** ArchUnitの背後にあるアイデア [#k84e0c33] https://www.archunit.org/userguide/html/000_Index.html#_ideas_and_concepts ** ArchUnitで考えるアーキテクチャ構造とその検証 [#t125f92b] https://developer.mamezou-tech.com/blogs/2022/05/19/archunit-and-architechure/ ** サンプル [#la9c5133] import static com.tngtech.archunit.base.DescribedPredicate.alwaysTrue; import static com.tngtech.archunit.core.domain.JavaClass.Predicates.belongToAnyOf; import static com.tngtech.archunit.library.Architectures.layeredArchitecture; import com.tngtech.archunit.core.importer.ImportOption.DoNotIncludeTests; import com.tngtech.archunit.junit.AnalyzeClasses; import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.lang.ArchRule; @AnalyzeClasses(packagesOf = UwmRadarApp.class, importOptions = @AnalyzeClasses(packagesOf = MySomeApp.class, importOptions = DoNotIncludeTests.class) class TechnicalStructureTest { // prettier-ignore @ArchTest static final ArchRule respectsTechnicalArchitectureLayers = layeredArchitecture() .layer("Config").definedBy("..config..") .layer("Web").definedBy("..web..") .optionalLayer("Service").definedBy("..service..") .layer("Security").definedBy("..security..") .layer("Persistence").definedBy("..repository..") .layer("Domain").definedBy("..domain..") .whereLayer("Config").mayNotBeAccessedByAnyLayer() .whereLayer("Web").mayOnlyBeAccessedByLayers("Config") .whereLayer("Service").mayOnlyBeAccessedByLayers("Web", "Config") .whereLayer("Security").mayOnlyBeAccessedByLayers("Config", "Service", "Web") .whereLayer("Persistence").mayOnlyBeAccessedByLayers("Service", "Security", "Web", "Config") .whereLayer("Domain").mayOnlyBeAccessedByLayers("Persistence", "Service", "Security", "Web", "Config") .ignoreDependency(belongToAnyOf(MySomeApp.class), alwaysTrue()) .ignoreDependency(alwaysTrue(), belongToAnyOf( com.suho.uwmradar.config.Constants.class, com.suho.uwmradar.config.ApplicationProperties.class )); }