同包下Gradle自定义itest源集为何仍需配置依赖main的编译输出
问题解答
为什么需要添加compileClasspath += sourceSets.main.output与runtimeClasspath += sourceSets.main.output配置
- 包名相同只是Java语法层面的访问权限前提,类互相可见的基础是编译/运行时目标类所在路径被加入对应阶段的classpath。如果main的编译输出根本不在itest的编译classpath中,编译器无法定位到pojo类,哪怕包名完全一致也会抛出类不存在的编译错误。
- Gradle的
java/java-library插件只会对内置的main、test两个默认源集做自动关联配置,你自定义的itest源集没有预设的关联规则,必须手动补充配置:compileClasspath += sourceSets.main.output:保证编译itest下的代码时,可以找到main中定义的类runtimeClasspath += sourceSets.main.output:保证运行itest测试用例时,可以正常加载main中定义的类
Gradle默认test源集可以直接访问main代码的实现逻辑
java插件(java-library插件继承自java插件)已经内置了默认配置规则:
- 自动将
sourceSets.main.output加入test源集的compileClasspath和runtimeClasspath - 同时
testImplementation、testRuntimeOnly等依赖配置默认继承main对应的依赖配置
因此不需要手动补充额外的关联配置,test下的测试用例就可以直接访问main编译生成的代码。
内容的提问来源于stack exchange,提问作者Fernando
相关产品推荐
相关产品推荐

