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

Gradle构建Fat Jar生成旧版本代码问题排查求助

解决Gradle构建Fat Jar总是生成旧版本的问题

这种情况我之前踩过坑,大概率是Gradle缓存或者构建配置的问题——毕竟你IntelliJ直接跑main函数正常,说明代码本身没问题,咱们一步步排查:

1. 先彻底清理Gradle缓存

Gradle的缓存经常会"hold住"旧的编译产物,哪怕你改了代码也不会更新。缓存位置如下:

  • Windows:C:\Users\<你的用户名>\.gradle\caches
  • macOS/Linux:~/.gradle/caches

你可以先手动删除这个缓存目录,或者用Gradle命令清理项目构建产物+缓存:

# Linux/macOS
./gradlew clean build --no-build-cache

# Windows
gradlew clean build --no-build-cache

clean会删除项目根目录下的build文件夹,--no-build-cache会强制跳过Gradle的构建缓存,确保重新编译所有代码。

2. 检查Fat Jar的构建任务配置

如果用的是Shadow插件(最常用的Fat Jar插件),要确保你的shadowJar任务正确依赖了编译任务,不然可能直接打包旧的class文件。比如你的build.gradle(或build.gradle.kts)里应该有类似配置:

plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.2' // 版本可以选最新的
}

shadowJar {
    // 指定主类,确保能直接运行Jar
    manifest {
        attributes 'Main-Class': 'com.yourpackage.YourMainClass'
    }
    // 确保任务依赖编译任务,构建时先编译再打包
    dependsOn compileJava
}

如果是自定义的Jar任务,一定要加上from sourceSets.main.output,这样才会把最新编译的class文件包含进去:

jar {
    manifest {
        attributes 'Main-Class': 'com.yourpackage.YourMainClass'
    }
    // 引入最新的编译输出
    from sourceSets.main.output
    // 依赖编译任务
    dependsOn compileJava
}

3. 验证Jar包内容是否真的更新了

有时候Jar的修改时间更新了,但里面的内容还是旧的,这时候可以用命令查看Jar里的文件:

jar tf ./build/libs/your-fat-jar-name.jar

或者直接把Jar解压,看看里面的class文件的修改时间是不是和你最新代码的修改时间一致。如果解压后class还是旧的,说明你的构建任务根本没触发重新编译,得回头检查任务依赖。

4. 同步IntelliJ和Gradle的状态

有时候IntelliJ的Gradle同步没跟上,导致IDE里的修改没同步到Gradle的构建流程里。你可以:

  • 点击IntelliJ右上角的「Sync Project with Gradle Files」按钮(就是那个大象图标旁边的刷新按钮)
  • 极端情况下,关闭IntelliJ,删除项目根目录下的.idea文件夹和build文件夹,然后重新导入项目再构建

内容的提问来源于stack exchange,提问作者Dragon Creature

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:09:33