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

如何为多Gradle模块构建并发布含common源码的SDK单一JAR包

解决方案:打包带Common源码的SDK JAR,同时保留依赖声明

完全可行,给你两种Gradle实现方案,既能合并SDK与Common的代码,又能保留Common的Spring依赖声明:


方案一:用Shadow插件(推荐)

Shadow插件能灵活控制打包内容,刚好匹配你的需求。在sdk/build.gradle里这么配置:

plugins {
    id 'java'
    id 'maven-publish'
    id 'com.github.johnrengelman.shadow' version '8.1.1' // 用最新稳定版即可
}

shadowJar {
    // 把SDK自身代码和Common编译后的class文件合并到同一个JAR
    from sourceSets.main.output
    from project(':common').sourceSets.main.output
    
    // 排除Spring这类第三方依赖,不打包进JAR
    exclude 'org/springframework/**'
    // 如有其他需要排除的第三方依赖,按此格式添加即可
    // exclude 'com/xxx/**'
    
    // 可选:给最终JAR设置一个辨识度高的名称
    archiveBaseName.set('sdk-with-common')
}

publishing {
    publications {
        maven(MavenPublication) {
            artifact shadowJar // 指定发布Shadow生成的JAR
            from components.java // 自动保留所有依赖声明,包括Common的Spring依赖
        }
    }
    repositories {
        maven {
            url = uri('https://你的JFrog仓库地址')
            credentials {
                username = project.findProperty('jfrogUsername') ?: System.getenv('JFROG_USERNAME')
                password = project.findProperty('jfrogPassword') ?: System.getenv('JFROG_PASSWORD')
            }
        }
    }
}

// 执行build时自动生成Shadow JAR
tasks.build.dependsOn shadowJar

配置后,打包出的JAR仅包含SDK和Common的代码,Spring等第三方依赖不会被打包,但发布到JFrog后的POM文件会自动带上Common的Spring依赖声明——客户端使用时,既能直接调用Common里的DTO,又能通过构建工具自动拉取Spring依赖。


方案二:自定义JAR任务(无需Shadow插件)

如果不想用第三方插件,用Gradle原生任务也能实现:

plugins {
    id 'java'
    id 'maven-publish'
}

// 自定义任务,合并SDK与Common的编译产物
task customSdkJar(type: Jar) {
    from sourceSets.main.output
    from project(':common').sourceSets.main.output
    archiveBaseName.set('sdk-with-common')
}

publishing {
    publications {
        maven(MavenPublication) {
            artifact customSdkJar
            from components.java // 同样保留所有依赖声明
        }
    }
    repositories {
        maven {
            url = uri('https://你的JFrog仓库地址')
            credentials {
                username = project.findProperty('jfrogUsername') ?: System.getenv('JFROG_USERNAME')
                password = project.findProperty('jfrogPassword') ?: System.getenv('JFROG_PASSWORD')
            }
        }
    }
}

tasks.build.dependsOn customSdkJar

这个方案直接通过原生Jar任务合并两个模块的代码,效果和Shadow插件一致:第三方依赖不会被打包,POM文件会保留完整的依赖传递关系。


验证方式

执行命令./gradlew :sdk:publish将包推送到JFrog,客户端引入该SDK依赖后:

  • 无需单独依赖Common模块,就能直接使用其中的DTO类
  • 客户端的构建工具(Maven/Gradle)会自动从POM文件拉取Spring等依赖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:27:40