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

Gradle项目(依赖存于TOML)生成完整依赖POM文件求助

解决Gradle生成POM包含所有依赖的问题

Gradle的maven-publish插件默认仅会将api、implementation配置的依赖写入POM的对应scope,compileOnly、testImplementation等其他配置的依赖不会自动纳入。要让这些依赖出现在生成的POM中,需要手动在MavenPublication里添加对应配置的依赖映射:

修改后的build.gradle配置

plugins {
    id 'maven-publish'
}

dependencies {
    api ( libs.bundles.api) {
        exclude(group: 'org.apache.hadoop', module: 'zookeeper')
        exclude(group: 'org.apache.hadoop', module: 'slf4j-log4j12')
        exclude(group: 'org.apache.hadoop', module: 'log4j')
        exclude(group: 'org.apache.hadoop', module: 'jsp-api')
        exclude(group: 'org.apache.hadoop', module: 'servlet-api')
    }
    compileOnly(libs.slf4j.api)
    testImplementation(libs.bundles.test.implementation)
    annotationProcessor(libs.lombok)
    testAnnotationProcessor(libs.lombok)
}

publishing {
    publications {
        customPublication(MavenPublication) {
            from components.java
            
            // 将compileOnly依赖映射到POM的provided scope
            compileOnlyDependencies.each { dep ->
                pom.withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dep.module.group)
                    dependencyNode.appendNode('artifactId', dep.module.name)
                    dependencyNode.appendNode('version', dep.module.version)
                    dependencyNode.appendNode('scope', 'provided')
                    // 同步依赖的exclude规则
                    dep.excludeRules.each { exclude ->
                        def exclusionsNode = dependencyNode.appendNode('exclusions')
                        def exclusionNode = exclusionsNode.appendNode('exclusion')
                        exclusionNode.appendNode('groupId', exclude.group)
                        exclusionNode.appendNode('artifactId', exclude.module)
                    }
                }
            }
            
            // 将testImplementation依赖映射到POM的test scope
            testImplementationDependencies.each { dep ->
                pom.withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dep.module.group)
                    dependencyNode.appendNode('artifactId', dep.module.name)
                    dependencyNode.appendNode('version', dep.module.version)
                    dependencyNode.appendNode('scope', 'test')
                    // 同步依赖的exclude规则
                    dep.excludeRules.each { exclude ->
                        def exclusionsNode = dependencyNode.appendNode('exclusions')
                        def exclusionNode = exclusionsNode.appendNode('exclusion')
                        exclusionNode.appendNode('groupId', exclude.group)
                        exclusionNode.appendNode('artifactId', exclude.module)
                    }
                }
            }
            
            // 处理注解处理器依赖,Maven无直接对应scope,映射为provided
            [annotationProcessorDependencies, testAnnotationProcessorDependencies].each { deps ->
                deps.each { dep ->
                    pom.withXml {
                        def dependenciesNode = asNode().appendNode('dependencies')
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', dep.module.group)
                        dependencyNode.appendNode('artifactId', dep.module.name)
                        dependencyNode.appendNode('version', dep.module.version)
                        dependencyNode.appendNode('scope', 'provided')
                        // 同步依赖的exclude规则
                        dep.excludeRules.each { exclude ->
                            def exclusionsNode = dependencyNode.appendNode('exclusions')
                            def exclusionNode = exclusionsNode.appendNode('exclusion')
                            exclusionNode.appendNode('groupId', exclude.group)
                            exclusionNode.appendNode('artifactId', exclude.module)
                        }
                    }
                }
            }
        }
    }
}

核心说明

  • compileOnly对应Maven的provided scope:这类依赖仅编译时需要,运行时由外部环境提供。
  • testImplementation对应Maven的test scope:仅用于测试代码的编译与运行阶段。
  • 注解处理器(annotationProcessor/testAnnotationProcessor):Maven无直接匹配的scope,通常标记为provided;若需严格对齐Maven的注解处理器配置,还可额外修改POM的build节点添加maven-compiler-plugin的<annotationProcessorPaths>配置。
  • 代码中同步了所有依赖的exclude规则,保证POM依赖配置与Gradle原生配置完全一致。

执行gradle publishToMavenLocal后,生成的POM文件即可包含所有配置的依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:35:25