You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Gradle下载JFrog仓库中作为编译依赖的Swagger yaml文件

问题原因

你之前的配置不生效,本质是SNAPSHOT版本的动态构件解析逻辑问题:Gradle默认针对SNAPSHOT版本会读取对应maven-metadata.xml匹配构件类型,你直接指定ext: 'yaml'时如果元数据未正确标注yaml构件,就会出现解析失败的情况。

方案一:使用Gradle原生依赖管理(推荐)

该方案符合Gradle依赖管理规范,无需额外调用API,仅需调整配置即可:

  1. 首先确保JFrog仓库已正确配置到Gradle仓库列表中:
repositories {
    maven {
        url "替换为你的JFrog Maven仓库地址"
        credentials {
            // 凭证建议从gradle.properties或环境变量读取,不要硬编码
            username = project.property('jfrog.username')
            password = project.property('jfrog.password')
        }
        // 若该仓库仅存SNAPSHOT构件可添加以下配置提升解析效率
        mavenContent {
            snapshotsOnly()
        }
    }
}
  1. 定义独立配置项隔离swagger yaml依赖,避免和编译类路径混淆:
// 定义专属配置
configurations {
    swaggerYaml
}

dependencies {
    swaggerYaml(group: 'com.myorg.myproject', name: 'resource', version: '19.9.0.0-1-SNAPSHOT', ext: 'yaml')
}
  1. 新增下载任务绑定到编译流程,自动下载yaml到指定目录:
task downloadSwaggerYaml(type: Copy) {
    // 从专属配置中读取解析后的yaml文件
    from configurations.swaggerYaml
    // 输出到指定目录,示例为构建后的resources目录
    into "${project.buildDir}/resources/main/swagger"
    // 可选:重命名文件,去掉SNAPSHOT时序后缀方便后续使用
    rename { 'api.yaml' }
}

// 绑定到编译Java任务前执行,确保编译阶段可读取到文件
compileJava.dependsOn downloadSwaggerYaml

方案二:调用JFrog API直接下载(兼容元数据缺失场景)

如果JFrog中对应构件的maven元数据不完整导致方案一失效,可以直接调用JFrog的搜索API拉取最新SNAPSHOT版本的yaml文件:

task downloadSwaggerYaml {
    // 按需修改以下配置
    def jfrogHost = "替换为你的JFrog域名"
    def repoName = "替换为存放构件的仓库名,如maven-snapshots"
    def groupPath = "com/myorg/myproject"
    def artifactName = "resource"
    def snapshotVersion = "19.9.0.0-1-SNAPSHOT"
    def outputFile = new File("${project.buildDir}/resources/main/swagger/api.yaml")
    
    outputs.file(outputFile)
    doLast {
        // 调用JFrog搜索API获取最新的SNAPSHOT构件版本号
        def searchUrl = "${jfrogHost}/artifactory/api/search/latestVersion?g=${groupPath.replace('/','.')}&a=${artifactName}&v=${snapshotVersion}&repos=${repoName}"
        def authHeader = "Basic " + "${project.property('jfrog.username')}:${project.property('jfrog.password')}".bytes.encodeBase64().toString()
        
        def latestVersion = new URL(searchUrl).openConnection().with { conn ->
            conn.setRequestProperty("Authorization", authHeader)
            conn.inputStream.text.trim()
        }
        
        // 拼接下载地址拉取yaml文件
        def downloadUrl = "${jfrogHost}/artifactory/${repoName}/${groupPath}/${artifactName}/${snapshotVersion}/${artifactName}-${latestVersion}.yaml"
        new URL(downloadUrl).openConnection().with { conn ->
            conn.setRequestProperty("Authorization", authHeader)
            outputFile.parentFile.mkdirs()
            outputFile.bytes = conn.inputStream.bytes
        }
    }
}

compileJava.dependsOn downloadSwaggerYaml

注意事项

  • 所有敏感凭证禁止硬编码在构建脚本中,建议存放在项目外的gradle.properties或者CI环境变量中
  • 若使用方案一,可先手动检查JFrog中对应SNAPSHOT目录下的maven-metadata.xml是否包含yaml构件的记录,缺失的话需要调整构件发布逻辑补充元数据

内容的提问来源于stack exchange,提问作者Shailesh Suryawanshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 00:06:00