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

如何在Gradle 7.2+项目中收集所有依赖(含插件及传递依赖)

Gradle 7.2+ 隔离环境全量依赖收集与构建原生方案

一、收集所有项目依赖(含传递依赖)

1. 自定义任务遍历所有可解析配置

利用Gradle原生依赖API,编写任务直接获取所有已解析的依赖(包括传递依赖、变体如sources/javadoc):

tasks.register('downloadDependencies') {
    doLast {
        project.allprojects { p ->
            p.configurations.each { config ->
                if (config.canBeResolved) {
                    config.resolvedConfiguration.resolvedArtifacts.each { artifact ->
                        def module = artifact.moduleVersion.id
                        println "${module.group}:${module.name}:${module.version}:${artifact.classifier ?: ''}:${artifact.extension}".trim()
                    }
                }
            }
        }
    }
}

执行命令:./gradlew downloadDependencies,输出内容即为完整的依赖坐标列表。

2. 导出依赖到文件

如果需要持久化依赖列表,修改任务将结果写入文件:

tasks.register('exportDependencies') {
    def outputFile = rootProject.file('full-dependencies.txt')
    outputs.file(outputFile)
    
    doLast {
        outputFile.text = ''
        project.allprojects { p ->
            p.configurations.each { config ->
                if (config.canBeResolved) {
                    config.resolvedConfiguration.resolvedArtifacts.each { artifact ->
                        def module = artifact.moduleVersion.id
                        def coord = "${module.group}:${module.name}:${module.version}:${artifact.classifier ?: ''}:${artifact.extension}".trim()
                        outputFile.append("${coord}\n")
                    }
                }
            }
        }
    }
}

二、收集Gradle插件及插件依赖

1. 用buildEnvironment获取插件类路径

加上--all参数可包含子项目的插件依赖:

./gradlew buildEnvironment --all -q

通过过滤命令可提取有效坐标:

./gradlew buildEnvironment --all -q | grep -E "---|:" | grep -v "Project :"

2. 自定义任务导出插件及依赖

直接解析buildscript类路径和已应用插件的坐标:

tasks.register('exportPluginDependencies') {
    def outputFile = rootProject.file('plugin-dependencies.txt')
    outputs.file(outputFile)
    
    doLast {
        outputFile.text = ''
        // 收集所有项目已应用的插件
        project.allprojects { p ->
            p.pluginManager.plugins.each { plugin ->
                if (plugin.version) {
                    outputFile.append("${plugin.id}:${plugin.version}\n")
                }
            }
        }
        // 收集buildscript中的插件依赖
        project.buildscript.configurations.classpath.resolvedConfiguration.resolvedArtifacts.each { artifact ->
            def module = artifact.moduleVersion.id
            outputFile.append("${module.group}:${module.name}:${module.version}\n")
        }
    }
}

三、批量迁移依赖到私有Nexus

基于收集到的依赖列表,编写临时Gradle项目实现批量上传:

plugins {
    id 'maven-publish'
}

repositories {
    mavenCentral() // 仅用于拉取待迁移依赖
}

publishing {
    repositories {
        maven {
            url = uri('http://your-private-nexus/repository/releases/')
            credentials {
                username = 'nexus-username'
                password = 'nexus-password'
            }
        }
    }
}

tasks.register('uploadAllDependencies') {
    def depListFile = file('full-dependencies.txt')
    inputs.file(depListFile)
    
    doLast {
        depListFile.eachLine { line ->
            if (line.trim()) {
                def parts = line.split(':')
                def group = parts[0]
                def name = parts[1]
                def version = parts[2]
                def classifier = parts.size() > 3 ? parts[3] : null
                def ext = parts.size() > 4 ? parts[4] : 'jar'
                
                def tempConfig = configurations.create("tempDepUpload-${UUID.randomUUID()}")
                tempConfig.dependencies.add(
                    dependencies.create("${group}:${name}:${version}") {
                        if (classifier) this.classifier = classifier
                        this.extension = ext
                    }
                )
                
                tasks.register("upload-${group}-${name}-${version}", Upload) {
                    configuration = tempConfig
                    repositories {
                        mavenDeployer {
                            repository(url: publishing.repositories.maven.url) {
                                authentication(userName: publishing.repositories.maven.credentials.username, password: publishing.repositories.maven.credentials.password)
                            }
                        }
                    }
                }.get().execute()
                
                configurations.remove(tempConfig)
            }
        }
    }
}

四、隔离环境构建配置

修改settings.gradle强制所有依赖从私有Nexus拉取:

pluginManagement {
    repositories {
        maven { url = uri('http://your-private-nexus/repository/plugins/') }
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url = uri('http://your-private-nexus/repository/releases/') }
        maven { url = uri('http://your-private-nexus/repository/snapshots/') }
    }
}

同时移除项目build.gradle中所有外部仓库配置,确保构建完全隔离。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:27:05