Gradle发布至Artifactory快照仓库时SNAPSHOT未解析为时间戳问题
我之前也碰到过一模一样的问题——用Gradle的maven-publish和Artifactory插件发布快照时,版本号始终是1.0.1-SNAPSHOT.jar这种原始格式,没有自动转换成带时间戳的版本,导致依赖这个项目的构建拉取快照时频繁出问题。而Maven能正常处理,核心原因是Maven默认内置了快照版本的时间戳转换逻辑,Gradle的maven-publish插件则需要我们显式配置来触发这个行为,同时配合Artifactory插件的正确设置。
下面是一步步的解决方法:
1. 确认项目版本的基础配置
首先检查你的build.gradle,确保版本号确实带有-SNAPSHOT后缀:
group = "com.yourcompany" artifactId = "your-project" version = "1.0.1-SNAPSHOT"
2. 配置maven-publish的快照版本映射
在publishing块中,给你的Maven Publication添加版本映射规则,让Gradle识别快照版本并生成时间戳格式:
publishing { publications { mavenJava(MavenPublication) { from components.java // 配置版本映射,确保快照版本按Maven规则生成时间戳 versionMapping { usage('java-api') { fromResolutionOf('runtimeClasspath') } usage('java-runtime') { fromResolutionResult() } } // 保证pom文件中的版本与项目版本一致 pom { version = project.version groupId = project.group artifactId = project.artifactId } } } }
3. 调整Artifactory插件的发布配置
关键是在artifactory块的发布仓库配置中开启maven = true,这会告诉Artifactory插件按照Maven的快照规则处理发布流程:
plugins { id 'java' id 'maven-publish' id 'com.jfrog.artifactory' version 'latest-stable-version' // 替换为你使用的插件版本 } artifactory { contextUrl = "http://your-artifactory-url" // 你的Artifactory实例地址 publish { repository { repoKey = 'libs-snapshot-local' // 你的快照仓库Key username = artifactoryUsername // 建议从gradle.properties读取敏感信息 password = artifactoryPassword maven = true // 核心配置:启用Maven风格快照处理 } defaults { publications('mavenJava') // 指定要发布的publication publishArtifacts = true publishPom = true } } resolve { repository { repoKey = 'libs-snapshot' // 快照仓库的读取Key username = artifactoryUsername password = artifactoryPassword maven = true } } }
4. 检查Artifactory仓库的快照行为设置
登录Artifactory后台,找到你的快照仓库(比如libs-snapshot-local),进入Repository Settings -> Maven Settings,确认Snapshot Version Behavior设置为Unique。这个设置会强制要求上传的快照版本是带时间戳的,避免同名jar被覆盖,同时也能让Artifactory正确识别Gradle上传的快照包。
5. 测试发布
执行Gradle发布任务验证效果:
./gradlew clean build artifactoryPublish
之后去Artifactory仓库查看,应该能看到类似1.0.1-20240520.153022-1.jar格式的快照包了,依赖该项目的其他构建也能正常解析到最新的快照版本。
内容的提问来源于stack exchange,提问作者Dean

