如何为多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
相关产品推荐
相关产品推荐

