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肯定已经存在:
- 先给子项目添加
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 } } }
- 父项目不需要再单独配置针对子项目的发布逻辑,直接调用
publish任务会自动执行子项目的发布流程。
内容的提问来源于stack exchange,提问作者user597973
相关产品推荐
相关产品推荐

