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的providedscope:这类依赖仅编译时需要,运行时由外部环境提供。testImplementation对应Maven的testscope:仅用于测试代码的编译与运行阶段。- 注解处理器(
annotationProcessor/testAnnotationProcessor):Maven无直接匹配的scope,通常标记为provided;若需严格对齐Maven的注解处理器配置,还可额外修改POM的build节点添加maven-compiler-plugin的<annotationProcessorPaths>配置。 - 代码中同步了所有依赖的exclude规则,保证POM依赖配置与Gradle原生配置完全一致。
执行gradle publishToMavenLocal后,生成的POM文件即可包含所有配置的依赖。
内容的提问来源于stack exchange,提问作者Vlados
相关产品推荐
相关产品推荐

