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

如何从命令行运行Java项目?Gradle构建后Jar包Log4j2依赖缺失报错

解决Jar运行时Log4j2类找不到的问题

这个问题我太熟悉了——你碰到的NoClassDefFoundError本质是Gradle默认的jar任务生成的Jar只包含你自己的业务代码,根本没把Log4j2这类第三方依赖打包进去!而Eclipse运行时会自动把项目依赖加到类路径里,所以本地跑完全没问题,但单独执行Jar时就找不到依赖类了。

下面给你两种最实用的解决方案,优先推荐第一种,省心又高效:

方案一:用Shadow插件打“胖Jar”(推荐)

Shadow插件会把你的代码和所有依赖包打包成一个独立的可执行Jar,直接运行就行,不用管依赖的问题。

  1. 首先在你的build.gradle里引入Shadow插件:
plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.2' // 可以用最新版本号
}
  1. 配置ShadowJar任务,指定你的主类(这样Manifest会自动设置启动类):
shadowJar {
    manifest {
        attributes 'Main-Class': 'com.xxxxxx.practice.App' // 替换成你实际的主类全路径
    }
}
  1. 执行构建命令:
gradlew shadowJar

执行完成后,去build/libs/目录找生成的Jar(名字一般是testproj-all.jar,带-all后缀的那个),直接用命令运行:

java -jar build/libs/testproj-all.jar

这个Jar包含了所有依赖,包括Log4j2,直接就能正常运行日志功能。

方案二:配置Manifest类路径+自动复制依赖

如果你不想用Shadow插件,也可以通过配置Jar的Manifest文件,手动指定依赖的类路径,同时让Gradle自动把依赖复制到Jar旁边的目录。

  1. 在build.gradle里配置jar任务,设置主类和类路径:
jar {
    manifest {
        attributes(
            'Main-Class': 'com.xxxxxx.practice.App', // 你的主类全路径
            // 生成依赖的类路径,指向Jar同级的lib目录下的依赖包
            'Class-Path': configurations.runtimeClasspath.files.collect { "lib/${it.name}" }.join(' ')
        )
    }
}
  1. 添加一个任务,自动把依赖复制到Jar所在目录的lib文件夹:
task copyDependencies(type: Copy) {
    from configurations.runtimeClasspath // 取所有运行时依赖
    into "${buildDir}/libs/lib" // 复制到build/libs/lib目录
}

// 让jar任务执行完成后自动执行复制依赖的任务
jar.finalizedBy(copyDependencies)
  1. 执行构建命令:
gradlew jar

之后你会在build/libs下看到你的testproj.jar和一个lib文件夹(里面是所有依赖,包括Log4j2),直接运行Jar即可:

java -jar build/libs/testproj.jar

这种方法需要Jar和lib文件夹一起存在,不能单独移动Jar,不如Shadow插件灵活。

为什么dist任务能正常运行?

你提到的dist任务(比如distZip/distTar)会把你的Jar、所有依赖和自动生成的启动脚本打包在一起,启动脚本里已经帮你配置好了完整的类路径,所以解压后运行脚本就能正常加载Log4j2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:47:29