(谢邀,刚用mvn dependency:purge-local-repository救回项目) 如果你问Java工程师最想删掉哪个依赖,99%的人会回答:“所有日志库”。这不是玩笑,而是用每秒6000次NoClassDefFoundError换来的血泪共识。
一、依赖绑架:开源社区的集体犯罪
打开任何Spring Boot项目的pom.xml,你会看到这样的恐怖片剧本:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId> <!-- 默认塞给你Logback -->
</dependency>
<!-- 但当你试图引入Log4j2时 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<exclusions>
<!-- 必须手动肢解这个肿瘤 -->
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
这不是技术选型,而是框架作者对开发者的系统性PUA:
- Log4j 2.x的log4j-slf4j-impl与Logback的logback-classic必然同归于尽
- JUL的java.util.logging永远在JDK里阴笑:“没想到吧?我还在!”
- Commons Logging的jcl-over-slf4j像寄生虫般潜伏在Spring Core 更无耻的是,这些库的文档都写着“轻量级”“无侵入”,结果每个starter包都自带300KB以上的日志垃圾。
二、版本号恐怖主义:Maven中央仓库的垃圾场
某知名云厂商SDK的pom.xml曾出现这样的配置:
<dependency>
<groupId>com.xxx</groupId>
<artifactId>cloud-sdk</artifactId>
<version>2.5.0</version>
<exclusions>
<!-- 被迫排除其强推的Log4j 1.x残骸 -->
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
这不是孤例,而是Java生态的日常恐怖:
- Hibernate 5.x默认捆绑jboss-logging,导致与SLF4J的战争
- Elasticsearch Java客户端强制绑定Log4j 2.x,无视你的Spring Boot配置
- Apache HttpClient悄悄引入Commons Logging,就像在披萨里塞死鱼 你如果在Stack Overflow搜索“SLF4J multiple bindings”,会看到127万条绝望的呐喊——这相当于全球Java工程师集体浪费了214人年的生命。
三、架构师的皇帝新衣:复杂度驱动的KPI
日志库的混乱本质是既得利益者的阴谋:
- 面试官用“Log4j 2.x异步队列原理”过滤“不够资深的”求职者
- 技术书籍靠“第8章:日志框架整合详解”多卖50页纸
- 云厂商通过“日志采集兼容性认证”收取保护费 最讽刺的是,一个本应简单的需求被异化成这样:
// 人类想要的:
println("订单创建成功");
// Java生态给你的:
LoggerFactory.getLogger().info(
MarkerFactory.getMarker("BIZ"),
"{} {} [用户ID:{}] [TRACE_ID:{}]",
Instant.now().toString(),
Thread.currentThread().getName(),
UserContextHolder.get(),
MDC.get("traceId")
);
四、投降声明:我们已经不配拥有好工具
Python开发者已经用logging.basicConfig(level=INFO)开始工作了,Java工程师还在:
- 在IntelliJ里右击pom.xml选择"Show Dependencies"
- 对着一团乱麻的依赖图点击"Collapse All"
- 在控制台搜索"Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder" 这不是技术演进,而是整个生态的尊严破产。
结语:
建议Oracle在JDK 21新增java.util.logging.nuke包,提供以下功能:
- NukeLogger.detonateAllLoggingFrameworks(); // 一键清除所有第三方日志库
- NukeLogger.setOutput(System.out); // 回归println原始美 如果这无法实现,至少请各大厂在招聘要求中写明: “熟悉SLF4J依赖排除术,颈椎病程度≥Ⅱ期者优先录用”
(完)
如需讨论,欢迎到知乎文章页面发表评论。