Gradle publishToMavenLocal报错Invalid publication 'maven'
Gradle 7.2 发布依赖到本地Maven仓库报artifact不存在问题修复
问题场景
- 运行环境:Java 11、Gradle 7.2
- 需求:构建可复用Java依赖库,最终发布到公共Maven仓库供其他项目引用,当前阶段先完成本地
.m2仓库的发布验证 - 项目目录结构:
mylib/ lib/ src/ build.gradle
- 原lib模块
build.gradle配置:
plugins { id 'java-library' id 'maven-publish' id 'io.freefair.lombok' version "6.5.0-rc1" } sourceCompatibility = 1.11 targetCompatibility = 1.11 archivesBaseName = 'mylib' version = '1.0.0-RC1' group = 'org.example' repositories { mavenCentral() } dependencies { // 省略其余依赖 ) testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2' } publishing { publications { maven(MavenPublication) { artifact("build/libs/${archivesBaseName}-${version}.jar") { extension 'jar' } } } } tasks.named('test') { useJUnitPlatform() } publishToMavenLocal.configure { mustRunAfter build }
- 报错现象:执行
./gradlew clean build publishToMavenLocal时构建失败,核心报错信息:
Invalid publication 'maven': artifact file does not exist
提示路径/Users/myuser/workspace/mylib/lib/build/libs/mylib-1.0.0-RC1.jar不存在。即便命令行指定了任务顺序、脚本中配置了publishToMavenLocal必须在build任务后运行,实际执行时发布任务逻辑仍先于jar包生成执行,多次调整顺序配置均未解决。
根因说明
- 配置存在基础语法错误:
dependencies块中注释行后的闭合符错误写为圆括号),正确应为花括号},会直接导致构建脚本解析异常。 - 硬编码产物路径的写法会触发Gradle配置阶段校验:传入
build/libs/xxx.jar这类硬编码文件路径时,Gradle在脚本配置阶段就会检查该文件是否存在,这个阶段还没进入任务执行流程,不管怎么配置任务执行顺序,配置期找不到文件就会直接报错。 mustRunAfter是弱顺序约束,不会建立强依赖:该规则仅在两个任务都被纳入执行计划时才调整执行顺序,本身不会触发前置任务执行,也无法解决配置阶段的文件校验问题。
修复方案
直接修改build.gradle为如下配置即可:
plugins { id 'java-library' id 'maven-publish' id 'io.freefair.lombok' version "6.5.0-rc1" } sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 archivesBaseName = 'mylib' version = '1.0.0-RC1' group = 'org.example' repositories { mavenCentral() } dependencies { // 省略其余依赖 testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2' } publishing { publications { maven(MavenPublication) { // 直接引用jar任务作为发布产物,自动建立任务依赖,无需硬编码路径 artifact jar // 若需要发布源码包、javadoc包,补充对应任务引用即可,依赖会自动处理 // artifact sourcesJar // artifact javadocJar } } } tasks.named('test') { useJUnitPlatform() } // 删除原有的publishToMavenLocal顺序配置,任务隐式依赖会自动保证执行顺序
修改完成后直接执行./gradlew clean publishToMavenLocal即可完成本地发布,不需要手动在命令行追加build任务,maven-publish插件会自动按顺序执行编译、测试、打包、发布流程,不会再出现找不到jar包的问题。
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

