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

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包移到这个子模块下

配置脚本:

  1. 根目录的settings.gradle:
include ':abc-module', ':xyz-module'
  1. 每个子模块的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:32:41