Gradle解析依赖时为何将点转为斜杠?依赖路径匹配异常
配置与问题场景
我的build.gradle配置如下:
def external = file('../external').absolutePath repositories { maven { url file(external).toURI() } } dependencies { api 'ch.qos.cal10n:cal10n-api:0.7.7' }
项目依赖的第三方库手动下载后,存储在../external/ch.qos.cal10n/cal10n-api/0.7.7/目录下(包含.jar和.pom文件)。但执行gradle build时出现错误:
Execution failed for task ':compileJava'. > Could not resolve all files for configuration ':compileClasspath'. > Could not find ch.1qos.cal10n:cal10n-api:0.7.7. Searched in the following locations: - file:/home/a/b/external/ch/1qos/cal10n/cal10n-api/0.7.7/cal10n-api-0.7.7.pom
疑问:为何Gradle实际搜索路径是/home/a/b/external/ch/1qos/cal10n/cal10n-api/0.7.7/cal10n-api-0.7.7.pom,而非预期的/home/a/b/external/ch.qos.cal10n/cal10n-api/0.7.7/cal10n-api-0.7.7.pom?
原因分析
Maven仓库结构规范不匹配
当把本地目录配置为Maven仓库时,Gradle会严格遵循Maven的目录规则:Group ID中的每个英文句点(.)会被拆分为层级子目录,而非将整个Group ID作为单个目录。
对于依赖ch.qos.cal10n:cal10n-api:0.7.7,符合规范的存储路径应该是../external/ch/qos/cal10n/cal10n-api/0.7.7/,你当前的目录结构完全不符合这个规则,所以Gradle无法识别。依赖声明可能存在笔误
错误日志显示Gradle在查找ch.1qos.cal10n:cal10n-api:0.7.7,这说明你的依赖声明大概率把qos写成了1qos(字母q误写为数字1)。这种情况下,Gradle会按照错误的Group ID拆分目录,导致搜索路径变成ch/1qos/cal10n/...。
解决方法
- 调整目录结构:按照Maven规范重新组织目录,将
.jar和.pom文件移动到正确路径:../external/ch/qos/cal10n/cal10n-api/0.7.7/ - 检查依赖声明:确认
build.gradle中的依赖Group ID是ch.qos.cal10n,修正可能存在的笔误。
内容的提问来源于stack exchange,提问作者armaka

