Gradle 7.4.2构建应用报publishing()方法无签名错误咨询
Gradle 7.4.2 配置maven-publish发布到Nexus时报找不到publishing方法的解决方案
问题背景
跟随教程学习将制品发布到Nexus的操作,以简单Spring Boot Java应用为演示案例,自定义修改build.gradle配置后执行构建命令报错,当前使用Gradle版本为7.4.2。
修改后的原始配置如下:
plugins { id 'java' id 'org.springframework.boot' version '2.2.2.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' } group 'com.example' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 apply plugin: 'maven-publish' publishing { publications { maven(MavenPublication) { artifacts("build/libs/my-app-$version"+".jar") { extension = 'jar' } } } repositories { maven { name'nexus' url "http://someip:someport/repository/maven-snapshots/" credentials { username project.repoUser password project.repoPassword } } } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '5.2' testImplementation group: 'junit', name: 'junit', version: '4.12' }
执行构建时抛出的报错信息:
FAILURE: Build failed with an exception. * Where: Build file '/Users/matteo/Desktop/devops_bootcamp/java-app/build.gradle' line: 14 * What went wrong: A problem occurred evaluating root project 'my-app'. > No signature of method: build_49q3y83g7hdxe5s51k5187z33.publishing() is applicable for argument types: (build_49q3y83g7hdxe5s51k5187z33$_run_closure1) values: [build_49q3y83g7hdxe5s51k5187z33$_run_closure1@79692f52]
故障原因
这个报错是Gradle版本和插件声明语法不兼容导致的:
- Gradle 7.0及以上版本调整了插件扩展的注册逻辑,
maven-publish这类官方核心插件如果使用旧式apply plugin语法在plugins块外部声明,插件提供的publishing配置闭包不会被正确注入到构建脚本上下文,Gradle解析配置时找不到对应方法,直接抛出签名不匹配错误。 - 原配置里还存在两个兼容隐患:一是
name'nexus'的属性赋值写法不符合Gradle 7的语法规范,二是手动拼接jar包路径的制品声明方式,在Spring Boot项目中容易因为任务执行顺序、包名规则变化出现找不到文件的问题。
修复方法
按以下步骤调整配置即可:
- 删除原来
plugins块外部的apply plugin: 'maven-publish'行,把maven-publish插件声明统一放到顶部plugins块内:plugins { id 'java' id 'org.springframework.boot' version '2.2.2.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' id 'maven-publish' } - 调整
publishing块内的配置,补全属性赋值的等号,替换手动拼路径的制品声明为直接引用Spring Boot的jar包构建任务产出:publishing { publications { maven(MavenPublication) { artifact bootJar } } repositories { maven { name = 'nexus' url "http://someip:someport/repository/maven-snapshots/" credentials { username project.repoUser password project.repoPassword } } } } - 确认和
build.gradle同层级的gradle.properties文件中,已经配置好Nexus的账号密码参数:repoUser=你的Nexus登录用户名 repoPassword=你的Nexus登录密码
验证操作
配置调整完成后,先执行./gradlew build确认项目构建无报错,再执行./gradlew publish即可将制品推送到指定的Nexus仓库。
注意:使用Gradle Wrapper执行构建时命令是
./gradlew,不要直接写./gradle调用本地全局安装的Gradle,避免出现版本不一致问题。
内容的提问来源于stack exchange,提问作者matteo-g
相关产品推荐
相关产品推荐

