如何将测试固件打包进Gradle子模块发布JAR供外部项目使用?
解决Gradle子模块测试固件无法发布的问题
你的问题根源确实在于自定义的发布配置——默认的kotlin组件仅包含主代码源集,不会自动纳入java-test-fixtures插件生成的测试固件代码。下面提供两种解决方案:
方案1:发布单独的测试固件构件(推荐,符合Gradle规范)
这种方式会生成一个带test-fixtures分类器的独立JAR,外部项目可以通过标准的testFixtures依赖配置引用,不会污染主构件:
修改你subprojects中的发布配置,在现有MavenPublication中添加测试固件的JAR构件:
subprojects { // ... 其他原有配置 publishing { publications { create<MavenPublication>(project.name) { version = projectVersion artifactId = tasks.jar.get().archiveBaseName.get() groupId = "${projectGroup}.${rootProject.name}" from(components["kotlin"]) // 添加测试固件JAR作为额外构件 artifact(tasks.testFixturesJar.get()) { classifier = "test-fixtures" } } } } }
发布后,外部项目可以这样引用测试固件:
dependencies { testImplementation testFixtures(project(":your-module-name")) }
方案2:将测试固件合并到主JAR(不推荐)
如果确实需要把测试固件代码打包进主JAR(不建议,会混淆生产代码和测试代码边界),可以修改jar任务,纳入测试固件的编译输出:
subprojects { tasks { getByName<Jar>("jar") { enabled = true archiveClassifier.set("") // 加入测试固件的编译产物 from(sourceSets.testFixtures.get().output) } } // ... 其他原有配置 }
关键说明
java-test-fixtures插件会自动创建testFixturesJar任务和对应的源集,只要插件应用正确,该任务就会存在- 保持测试固件与主代码分离是Gradle的设计规范,方案1能避免依赖冲突和代码边界模糊问题
内容的提问来源于stack exchange,提问作者drue
相关产品推荐
相关产品推荐

