
本文详解在 Java + Gradle 项目中启用 Lombok @Slf4j 注解的完整配置:需同时引入 SLF4J API 和具体实现(如 Logback),并确保 Lombok 编译期处理生效,缺一不可。
本文详解在 java + gradle 项目中启用 lombok `@slf4j` 注解的完整配置:需同时引入 slf4j api 和具体实现(如 logback),并确保 lombok 编译期处理生效,缺一不可。
@Slf4j 是 Lombok 提供的便捷日志注解,它会在编译时自动为类生成一个名为 log 的静态 SLF4J 日志器字段(类型为 org.slf4j.Logger)。但该注解本身不提供日志实现,仅依赖 SLF4J API —— 因此必须显式添加 SLF4J 的 API 包和至少一个绑定实现(如 Logback 或 Log4j2),否则会出现 package org.slf4j does not exist 或 Cannot resolve method 'info(String)' 等编译错误。
你的 build.gradle 中存在两个关键问题:
- 缺失 SLF4J API 依赖:@Slf4j 需要 org.slf4j:slf4j-api,但当前只引入了 log4j:2.20.0(这是 Apache Log4j 1.x 的旧版,且未与 SLF4J 绑定);
- Lombok 仅声明为 compileOnly,但未配置 annotationProcessor 对 Java 编译器生效(Gradle 7.0+ 推荐改用 annotationProcessor,但需确保其作用于主源集)。
✅ 正确配置如下(推荐使用主流、轻量的 Logback 实现):
plugins {
id 'java'
}
group = 'org.example'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
// ✅ 必须:SLF4J API(@Slf4j 编译所需)
implementation 'org.slf4j:slf4j-api:2.0.13'
// ✅ 必须:SLF4J 的具体实现(Logback 是默认推荐)
runtimeOnly 'ch.qos.logback:logback-classic:1.5.6'
// ✅ Lombok:用于编译期代码生成
compileOnly 'org.projectlombok:lombok:1.18.32'
annotationProcessor 'org.projectlombok:lombok:1.18.32'
// 测试依赖(保持不变)
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.2'
}
// ✅ 启用注解处理器(Gradle 6.0+ 默认启用,但显式声明更可靠)
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
⚠️ 注意事项:
- 不要混用 log4j(1.x)或 log4j-core(2.x)作为 SLF4J 实现 —— 若坚持使用 Log4j2,请替换为 org.apache.logging.log4j:log4j-slf4j2-impl:2.21.0(注意是 slf4j2-impl,非 log4j),并移除 logback-classic;
- IDE(如 IntelliJ)需安装 Lombok Plugin 并启用 "Enable annotation processing"(Settings → Build → Compiler → Annotation Processors);
- @Slf4j 生成的 log 字段是 private static final,因此可直接在 main 方法中调用 log.info("hello");
- 若仍报错,请执行 ./gradlew clean build --refresh-dependencies 并重启 IDE。
修复后,你的代码将正常工作:
package MyApp;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MyApp {
public static void main(String[] args) {
log.info("Hello, SLF4J + Lombok is working!"); // ✅ 编译通过,运行输出日志
}
}
总结:@Slf4j 不是“开箱即用”的魔法,而是 SLF4J 生态与 Lombok 编译插件协同工作的结果。牢记三要素:SLF4J API(编译)、SLF4J 实现(运行)、Lombok 注解处理器(编译期生成代码)。任一缺失都会导致编译失败。











