首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring 必須依賴 commons-logging 的原因:JCL 橋接機制解析

     編輯:程式設計綜合問答

核心原因

Spring 內部**硬編碼依賴 Jakarta Commons Logging (JCL)** 作為日誌門面介面。org.springframework.util.LogFactory 靜態初始化時會尋找 LogFactory 實作,若類路徑缺少 commons-logging.jar 會拋 NoClassDefFoundError。

為何 Hibernate + Log4j + SLF4J 不需要?

  • Hibernate 使用 slf4j-api 做門面,搭配 slf4j-log4j12 綁定 Log4j 實作。
  • SLF4J 設計為**編譯時綁定**,無執行時動態尋找機制,故不需 JCL。

Spring 整合 SLF4J/Log4j 正確姿勢

  1. 排除 Spring 傳遞依賴的 commons-logging:
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  1. 引入 jcl-over-slf4j (JCL API 由 SLF4J 實作) + slf4j-api + logback-classic (或 slf4j-log4j12):
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.36</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
</dependency>

關鍵點

jcl-over-slf4j 讓 Spring 以為在用 JCL,實際轉給 SLF4J → Logback/Log4j,**完全移除 commons-logging.jar**,避免類衝突。

參考討論

OSChina 相關問答

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved