Gradle项目:从单个src/main/java目录生成多包独立Jar库
刚好之前处理过类似的需求,给你几个实用的Gradle方案,你可以根据自己的场景选:
方案一:利用SourceSets拆分源码集
这个方案不用改动现有项目结构,通过Gradle的sourceSets功能把两个包分别标记为独立的源码集,再为每个源码集生成对应的Jar包。
plugins { id 'java' } // 定义两个自定义源码集,分别对应abc和xyz包 sourceSets { abc { java { srcDir 'src/main/java' include 'abc/**' } } xyz { java { srcDir 'src/main/java' include 'xyz/**' } } } // 为每个源码集创建独立的Jar任务 task abcJar(type: Jar) { from sourceSets.abc.output archiveBaseName.set('abc') // 生成的Jar名称为abc.jar } task xyzJar(type: Jar) { from sourceSets.xyz.output archiveBaseName.set('xyz') // 生成的Jar名称为xyz.jar } // 让默认的assemble任务依赖这两个Jar任务,执行gradlew assemble时会一起生成 assemble.dependsOn(abcJar, xyzJar) // 原来的SampleProject.jar会由默认的jar任务自动生成,无需额外配置
优点:完全保留现有项目结构,源码集的方式更符合Gradle的规范,方便后续扩展(比如给不同包添加独立的依赖)。
方案二:直接自定义Jar任务过滤包
如果只是简单拆分Jar,不想额外定义源码集,这个轻量化方案更适合:
plugins { id 'java' } // 生成abc.jar,仅包含abc包下的所有类文件 task abcJar(type: Jar) { from sourceSets.main.output include 'abc/**' archiveBaseName.set('abc') } // 生成xyz.jar,仅包含xyz包下的所有类文件 task xyzJar(type: Jar) { from sourceSets.main.output include 'xyz/**' archiveBaseName.set('xyz') } assemble.dependsOn(abcJar, xyzJar)
优点:代码更简洁,快速实现需求,适合临时或简单的拆分场景。
方案三:拆分为多模块项目(长期维护推荐)
如果abc和xyz两个包的功能相对独立,后续可能会单独迭代或被其他项目依赖,建议把单模块拆成多模块结构,这是Gradle项目的最佳实践之一。
调整后的项目结构:
SampleProject/ ├── build.gradle ├── settings.gradle ├── abc-module/ │ └── src/main/java/abc/ // 把原abc包移到这个子模块下 └── xyz-module/ └── src/main/java/xyz/ // 把原xyz包移到这个子模块下
配置脚本:
- 根目录的
settings.gradle:
include ':abc-module', ':xyz-module'
- 每个子模块的
build.gradle(以abc-module为例,xyz-module同理):
plugins { id 'java' } // 自定义Jar名称为abc.jar jar { archiveBaseName.set('abc') }
执行gradlew assemble后,会在每个子模块的build/libs目录下生成对应的Jar包,也可以通过根项目的build/libs统一收集(需要额外配置分发任务)。
优点:模块边界清晰,依赖管理更方便,利于长期维护和扩展。
小提示
- 如果abc和xyz之间存在依赖关系,比如abc依赖xyz的类,需要在脚本中处理依赖:比如在方案一中让
abcJar依赖xyz源码集的编译任务;在方案三中给abc-module添加对xyz-module的依赖。 - 所有方案生成的Jar包默认都在项目根目录的
build/libs下(多模块的话子模块自己的build/libs也会有)。
内容的提问来源于stack exchange,提问作者Chintan Mahadik
相关产品推荐
相关产品推荐

