3

I want to verify, that classes within a given package, only refer to classes that reside in the package itself. However I get a violation, telling me that the a class depends on e.g. java.lang.String, which is totally ok for me. Is there a way to ignore the basic java packages?

        @ArchTest
        static final ArchRule zeroDependencyOfDomain = noClasses().that()
            .resideInAPackage("..domain..")
            .should().dependOnClassesThat()
            .resideOutsideOfPackages("..domain..");
bertolami
  • 2,896
  • 2
  • 24
  • 41

3 Answers3

2

If you don't want to explicitly specify all external packages like java., javax., com.google., org.apache. etc. and you just care about project packages, then you can just join two conditions like "domain or external lib".

String PROJECT_PACKAGE = "com.myproject..";

DescribedPredicate<JavaClass> domainOrExternalLibPredicate = JavaClass.Predicates.resideInAnyPackage("..domain..")
    .or(JavaClass.Predicates.resideOutsideOfPackage(PROJECT_PACKAGE));

@ArchTest
static final ArchRule zeroDependencyOfDomain = classes().that()
    .resideInAPackage("..domain..")
    .should().onlyDependOnClassesThat()
    .resideInAnyPackage(domainOrExternalLibPredicate);

In this caste, external lib is defined as anything outside your PROJECT_PACKAGE.

0

You can explicitly allow dependencies to java packages:

@ArchTest
static final ArchRule zeroDependencyOfDomain = noClasses().that()
    .resideInAPackage("..domain..")
    .should().dependOnClassesThat()
    .resideOutsideOfPackages("..domain..", "java..");

You could also use classes() and onlyDependOnClassesThat(), which a bit easier to read in my opinion:

@ArchTest
static final ArchRule zeroDependencyOfDomain = classes().that()
    .resideInAPackage("..domain..")
    .should().onlyDependOnClassesThat()
    .resideInAnyPackage("..domain..", "java..");
kapex
  • 28,903
  • 6
  • 107
  • 121
0

Similar to the other answer, I also found no better way yet than this:

private static final String[] COMMON_PACKAGES = {
    "java..",
    "javax..",
    "com.google..",
    "org.springframework.."};

@ArchTest
final ArchRule classesInProdutPackageNoOutsideAccess =
    classes()
        .that()
        .resideInAnyPackage(PACKAGE_FOO)
        .should()
        .onlyAccessClassesThat()
        .resideInAnyPackage(commonPackagesAnd(PACKAGE_FOO));


private static String[] commonPackagesAnd(String... packages) {
    return ArrayUtils.addAll(packages, COMMON_PACKAGES);
}
DerM
  • 1,497
  • 1
  • 14
  • 27