You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:45:03