Gradle多模块项目中跨模块注入runtimeOnly配置供Jib构建使用
问题根因
你将runtimeOnly依赖声明放在了任务的doFirst闭包中,Gradle在此阶段已经完成了全项目的依赖解析与配置阶段工作,后续执行Jib任务时无法识别到晚添加的依赖,因此:abc模块的jar不会被打入最终镜像。
可行方案
方案1:提前注入模块依赖(推荐)
将依赖注入逻辑从doFirst中移出,在配置阶段完成依赖声明:
// 放在统一Jib配置模块的build.gradle顶层,不要包在任务的doFirst里 project(':webapp') { dependencies { runtimeOnly project(':abc') } } // 原有Jib任务配置保留,删除doFirst中添加依赖的代码即可 ['jib', 'jibDockerBuild', 'jibBuildTar'].each { jibTaskName -> task "${jibTaskName}Webapp" { doFirst { project(':webapp').jib { to.image = 'jib-webapp' // 其他原有配置... } } finalizedBy ":webapp:$jibTaskName" } task "${jibTaskName}App" { doFirst { project(':app').jib { to.image = 'jib-app' // 其他原有配置... } } finalizedBy ":app:$jibTaskName" } }
如果仅希望执行Jib相关任务时才注入该依赖,可通过任务图判断实现:
gradle.taskGraph.whenReady { graph -> // 匹配所有Webapp相关的Jib任务 if (graph.allTasks.any { it.name.matches(/jib.*Webapp/) }) { project(':webapp').dependencies { runtimeOnly project(':abc') } } }
方案2:直接通过Jib配置添加额外Jar
不需要修改业务模块的依赖树,直接将:abc模块的构建产物打入镜像对应目录:
['jib', 'jibDockerBuild', 'jibBuildTar'].each { jibTaskName -> task "${jibTaskName}Webapp" { // 确保:abc模块先构建完成 dependsOn project(':abc').jar doFirst { project(':webapp').jib { to.image = 'jib-webapp' // 将:abc产出的Jar添加到Web应用的类路径目录 extraDirectories { paths { path = project(':abc').jar.archiveFile.get().asFile.absolutePath into = '/WEB-INF/lib' } } // 其他原有配置... } } finalizedBy ":webapp:$jibTaskName" } // 原有jibTaskNameApp配置保留 }
内容的提问来源于stack exchange,提问作者Santi
相关产品推荐
相关产品推荐

