如何在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
相关产品推荐
相关产品推荐

