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

Gradle父项目发布子项目Spring Boot JAR找不到bootJar任务如何解决

问题原因

报错是Gradle配置阶段的执行顺序导致的:父项目的publishing配置会在父项目的配置阶段立即执行,此时子项目:application的Spring Boot插件还未完成加载注册,bootJar任务还不存在,tasks.getByName()是立即查找任务的API,自然会抛出找不到任务的异常。

解决方案

方案1(最推荐):使用延迟任务引用替换立即查找

Gradle的tasks.named()方法会返回任务的Provider,不会在配置阶段立即查找任务,直到执行阶段才会解析,且artifact方法原生支持接收Provider作为参数,同时会自动建立任务依赖,不需要手动添加dependsOn。
父项目的配置修改如下:

plugins {
    id 'maven-publish'
}

publishing {
    publications {
        publishSpringBootJar(MavenPublication) {
            // 延迟获取bootJar任务,配置阶段不触发查找
            artifact project(':application').tasks.named('bootJar')
        }
    }
}

方案2:间接指定构件路径+手动依赖

如果要采用你提到的间接指定构件的方式也可以实现,注意需要匹配你子项目生成jar的命名规则:

plugins {
    id 'maven-publish'
}

publishing {
    publications {
        publishSpringBootJar(MavenPublication) {
            // 按子项目jar的实际生成路径填写
            artifact "${project(':application').buildDir}/libs/${project(':application').archivesBaseName}-${project(':application').version}.jar"
        }
    }
}

// 手动建立任务依赖,确保发布前先构建bootJar
tasks.named('publish') {
    dependsOn ':application:bootJar'
}

方案3(更符合Gradle惯例):将发布配置放到子项目中

直接把发布逻辑定义在:application子项目内,避免跨项目配置的顺序问题,子项目的Spring Boot插件加载完成后bootJar肯定已经存在:

  1. 先给子项目添加maven-publish插件:
// application子项目的build.gradle
plugins {
    id 'org.springframework.boot' version '2.5.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'maven-publish' // 新增发布插件
}

// 原有配置不变
repositories {
    mavenCentral()
}

dependencies {
    ...
}

// 新增发布配置
publishing {
    publications {
        publishSpringBootJar(MavenPublication) {
            artifact bootJar
        }
    }
}
  1. 父项目不需要再单独配置针对子项目的发布逻辑,直接调用publish任务会自动执行子项目的发布流程。

内容的提问来源于stack exchange,提问作者user597973

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:06:04