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

Gradle多模块项目中如何打包内部依赖并发布SDK?

解决Gradle多模块项目打包内部依赖发布SDK的问题

问题核心

你需要将layers-sdk模块打包为包含内部依赖(如libs)的Jar包,并发布到Maven仓库,同时确保导入该SDK的项目无需依赖未发布的内部模块。之前的做法因为POM文件仍保留内部依赖引用,导致导入时出现依赖找不到的错误。


推荐方案:使用Shadow插件

Shadow插件是Gradle生态中专门用于构建包含依赖的Fat Jar的工具,能自动处理依赖打包和POM依赖排除,避免手动配置的繁琐。

1. 根项目配置插件Classpath

在项目根目录的build.gradle.kts中添加Shadow插件的依赖:

buildscript {
    repositories {
        gradlePluginPortal()
    }
    dependencies {
        classpath("com.github.johnrengelman.shadow:7.1.2") // 可替换为最新版本
    }
}

2. 配置layers-sdk模块

在layers-sdk/build.gradle.kts中应用插件并完成打包、发布配置:

plugins {
    id("java")
    id("maven-publish")
    id("com.github.johnrengelman.shadow")
}

// 配置Shadow Jar:指定要打包的内部依赖
shadowJar {
    dependencies {
        include(dependency(project(":libs")))
        // 如有其他内部依赖,继续添加include(dependency(project(":xxx")))
    }
    // 移除默认的-shadow后缀,生成标准命名的Jar包
    archiveClassifier.set("")
}

// 配置发布:使用Shadow组件替代默认Java组件
publishing {
    publications {
        create<MavenPublication>("main") {
            from(components["shadow"]) // 关键:用Shadow组件输出,自动排除内部依赖的POM引用
            version = scmVersion.version
        }
    }
    repositories {
        // 替换为你的Maven仓库地址
        maven {
            url = uri("your-maven-repo-url")
            credentials {
                username = "your-username"
                password = "your-password"
            }
        }
    }
}

备选方案:手动配置(不使用插件)

如果不想引入第三方插件,可以手动处理Jar打包和POM依赖移除:

1. 配置Jar任务打包内部依赖

在layers-sdk/build.gradle.kts中修改Jar任务,将内部模块的代码打包进来:

tasks.jar {
    // 确保先构建内部模块的Jar
    dependsOn(project(":libs").tasks.jar)
    // 将内部模块的Jar解压后合并到当前Jar
    from(zipTree(project(":libs").tasks.jar.get().outputs.files.singleFile)) {
        // 排除重复的签名文件,避免冲突
        exclude("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA")
    }
}

2. 移除POM中的内部依赖引用

在发布配置中,手动删除POM文件里的内部依赖节点:

publishing {
    publications {
        create<MavenPublication>("main") {
            from(components["java"])
            version = scmVersion.version

            pom.withXml {
                val dependenciesNode = asNode().get("dependencies").single()
                // 移除所有内部模块的依赖节点
                dependenciesNode.children().removeIf { depNode ->
                    val groupId = depNode.get("groupId").single().text()
                    val artifactId = depNode.get("artifactId").single().text()
                    // 匹配你的内部模块坐标,可添加多个条件处理多个依赖
                    groupId == "com.test.ep" && artifactId == "lib"
                }
            }
        }
    }
    repositories {
        // 配置你的Maven仓库
        maven {
            url = uri("your-maven-repo-url")
            credentials {
                username = "your-username"
                password = "your-password"
            }
        }
    }
}

验证步骤

  1. 执行命令./gradlew :layers-sdk:publish完成发布
  2. 在外部项目中添加layers-sdk的依赖,执行构建确认无依赖找不到的错误
  3. 检查发布的POM文件,确认已移除内部模块的依赖引用

内容的提问来源于stack exchange,提问作者Marcus Vinicius Bianchi Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:45:25