Gradle打包生成dependencies.xml详解

在 Gradle 打包时生成 dependencies.xml 文件,可以通过创建一个自定义的 Gradle 任务来实现。该任务的核心是收集项目的依赖信息,并将其以 XML 格式写入文件。以下是两种主流方案:

方案一:使用内置的 dependencies 报告任务(推荐)

Gradle 内置了生成依赖报告的功能,我们可以配置一个自定义任务来生成 XML 格式的报告。

  1. 在 build.gradle 中添加自定义任务:

    groovy 复制代码
    // 定义一个生成 dependencies.xml 的任务 tasks.register('generateDependenciesXml') {
        group = 'reporting' // 将任务分组到 'reporting' 下,便于管理 description = 'Generates an XML file containing project dependencies.'
    
        // 指定任务在项目评估完成后执行,以确保依赖图已解析 doLast {
            // 获取项目的所有配置(如 implementation, testImplementation 等)
            def configurations = project.configurations
            // 创建一个 XML 文档结构 def xmlOutput = new groovy.xml.MarkupBuilder(new FileWriter("${buildDir}/dependencies.xml"))
    
            xmlOutput.dependencies {
                configurations.each { config ->
                    // 过滤掉非可解析的配置,避免错误 if (config.canBeResolved) {
                        try {
                            config.resolvedConfiguration.resolvedArtifacts.each { artifact ->
                                dependency {
                                    groupId(artifact.moduleVersion.id.group)
                                    artifactId(artifact.name)
                                    version(artifact.moduleVersion.id.version)
                                    configuration(config.name)
                                    classifier(artifact.classifier ?: '')
                                    type(artifact.extension)
                                }
                            }
                        } catch (Exception e) {
                            // 某些配置可能无法解析,例如 'detachedConfiguration',这里忽略错误 project.logger.info("无法解析配置 ${config.name} 的依赖: ${e.message}")
                        }
                    }
                }
            }
            println "依赖文件已生成: ${buildDir}/dependencies.xml"
        }
    }
    
    // 将生成依赖文件的任务关联到 assemble 任务,使得每次打包时自动执行
    tasks.named('assemble') {
        dependsOn tasks.named('generateDependenciesXml')
    }
  2. 执行任务:

    • 单独生成依赖文件:./gradlew generateDependenciesXml
    • 执行打包(如 jar)时,由于 assemble 依赖了该任务,dependencies.xml 会自动生成在 build/ 目录下。

方案二:集成 Maven 的 dependency:tree 目标(适用于混合项目)

如果你的项目同时支持 Maven,或者你需要与 Maven 格式完全兼容的 dependencies.xml,可以使用 maven 插件。

  1. 应用 Maven 插件并添加自定义任务:

    groovy 复制代码
    // 应用 Maven 插件    apply plugin: 'maven'
    
    // 自定义任务,调用 Maven 的 dependency:tree 并输出为 XML
    tasks.register('generateMavenDependencyTreeXml') {
        group = 'reporting'
        description = 'Generates Maven-style dependency tree in XML format using maven-dependency-plugin.'
    
        doLast {
            // 执行 Maven 目标。这需要本地已安装 Maven 且项目根目录有可用的 pom.xml。
            // 注意:这是一种变通方法,并非纯 Gradle 方式。
            exec {
                workingDir project.rootDir
                commandLine 'mvn', 'dependency:tree', '-DoutputFile=dependencies.xml', '-DoutputType=xml'
            }
            // 将生成的文件移动到 build 目录 ant.move(file: "${project.rootDir}/dependencies.xml",
                     tofile: "${buildDir}/dependencies.xml")
            println "Maven 格式依赖文件已生成: ${buildDir}/dependencies.xml"
        }
    }

    注意 :此方案依赖于外部 Maven 命令和 pom.xml 文件,通常仅在需要与现有 Maven 工具链兼容时使用。

方案对比

特性 方案一(纯 Gradle) 方案二(Maven 集成)
原理 利用 Gradle 的配置 API 直接解析依赖图并生成 XML 。 调用外部 Maven 命令 dependency:tree 生成报告。
兼容性 纯 Gradle 项目,无需其他工具。 需要本地安装 Maven 并存在 pom.xml。
输出格式 自定义 XML 结构,可灵活定义节点。 标准的 Maven dependency:tree XML 格式。
集成度 高,与 Gradle 构建生命周期无缝集成。 低,依赖于外部进程。
推荐场景 绝大多数 Gradle 项目,希望自动化生成依赖清单。 需要与下游 Maven 工具链保持格式严格一致的项目。

关键配置解析

  • configurations :代表项目的依赖配置集合(如 implementation, compileOnly, runtimeOnly 等)。
  • canBeResolved :用于过滤掉那些仅用于声明依赖而不用于解析的配置(如 compileClasspath 是可解析的,而 compileOnly 在旧版本中可能不可解析)。
  • resolvedConfiguration.resolvedArtifacts:获取已解析的依赖构件列表,包含组、名称、版本等详细信息 。
  • 任务依赖 (dependsOn) :通过 assemble.dependsOn generateDependenciesXml确保打包前生成依赖文件,实现自动化 。

参考来源

相关推荐
特立独行的猫A16 小时前
cj-tauri:用仓颉写桌面与鸿蒙 PC 应用
java·后端·python
Lonely丶墨轩16 小时前
从一个 404 到负数 ID:第三方接口开发中的几次排错
java
聪明的笨猪猪16 小时前
实际工程问题:AI生成MyBatis批量操作的SQL超限与性能雪崩
java·经验分享·面试·ai编程
文丑颜不良啊16 小时前
LeetCode2501~2520题目解析
java·leetcode
瑞雪兆丰年兮16 小时前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web
唐老板17 小时前
Spring Boot 4 默认开虚拟线程,HikariCP 却成瓶颈
java
2601_962106641 天前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
RuoyiOffice1 天前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
2601_962106641 天前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
杨凯凡1 天前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理