多模块Gradle项目中如何自动为ArchUnit传入所有模块的类进行架构检查?
多模块Gradle项目中如何自动为ArchUnit传入所有模块的类进行架构检查?
我太懂这种纠结了——在多模块Gradle项目里想让ArchUnit自动覆盖所有模块的架构检查,既不想手动挨个加依赖,又怕导入整个类路径搞出内存溢出,确实挺闹心的。结合你提到的场景,给你几个实际能用的思路:
方案一:用Gradle测试任务依赖整合类路径
这是最直接的解决办法,核心思路是让core模块的测试任务自动拉取所有子模块的编译输出,不用手动维护依赖:
- 打开core模块的
build.gradle(或build.gradle.kts),给测试任务配置依赖和类路径扩展:test { // 让core的测试任务依赖所有子模块的编译任务,确保先编译完所有模块再跑检查 dependsOn subprojects*.classes // 把所有子模块的主代码编译输出加到测试类路径里 subprojects.each { subproject -> classpath += subproject.sourceSets.main.output } } - 之后在你的ArchUnit测试里,直接用
ClassFileImporter().importPackages("com.example")就行,这时候它就能拿到所有模块下com.example包的类了,而且新增子模块会自动被包含进来,完全不用手动改配置。 - 额外提醒:可以在ArchUnit规则里加个过滤,排除测试类,比如
Classes().that().resideInAnyPackage("com.example..").and().areNotTests(),避免把测试代码也算进架构检查里。
方案二:自定义Gradle任务收集类文件路径
如果方案一的类路径还是太大,怕内存不够,可以试试更精细化的控制:
- 写一个简单的Gradle任务,遍历所有子模块的编译输出目录,收集
com.example下的.class文件路径,把这些路径写到一个临时文本文件里。 - 然后在ArchUnit测试里,读取这个文本文件,用
ClassFileImporter逐个导入这些指定的类文件。 - 这个方法的好处是你可以精准过滤掉不需要的类(比如第三方依赖、生成代码),进一步降低内存占用,而且新增模块也会被自动遍历到。
方案三:半自动化的共享测试包方案
如果上面两个方案都有适配问题,也可以优化你之前想到的“手动导入”思路,把工作量降到最低:
- 先在core模块里把ArchUnit测试打包成测试jar:
configurations { testArtifacts.extendsFrom testImplementation } task testJar(type: Jar) { from sourceSets.test.output archiveClassifier = 'test' } artifacts { testArtifacts testJar } - 然后在根项目的
build.gradle里,给所有子模块默认添加这个测试jar的依赖:subprojects { dependencies { testImplementation project(path: ':core', configuration: 'testArtifacts') } } - 这样一来,所有新创建的子模块只要继承根项目配置,就会自动引入core里的ArchUnit测试,每个模块跑自己的测试时会自动执行架构检查,也不用手动逐个加依赖。
备注:内容来源于stack exchange,提问作者ivan
相关产品推荐
相关产品推荐

