簡體   English   中英

Lombok @Log4j2 注釋不適用於最新版本的 log4j (v2.15.0)

[英]Lombok @Log4j2 annotation doesn't work with latest version of log4j (v2.15.0)

我將 log4j 依賴項升級到最新的 2.15.0 版本,現在我的 Spring 引導應用程序在啟動時拋出錯誤

Exception in thread "main" java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY
    at org.apache.logging.log4j.core.config.ConfigurationSource.<clinit>(ConfigurationSource.java:56)
    at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:32)
    at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:85)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:254)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:136)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:123)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:117)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:150)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
    at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:581)
    at foo.bar.org.MyApp.<clinit>(MyApp.java:13)

這是我的主要 class

@Log4j2
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
public class MyApp {

  public static void main(String[] args) {
    SpringApplication.run(MyApp.class, args);
  }
}

這不應該是lombok問題。 你的升級方法應該有問題。

升級log4j版本的正確方法:

對於maven ,設置 log4j2.version 屬性:

<properties>
    <log4j2.version>2.15.0</log4j2.version>
</properties>

對於gradle

ext['log4j2.version'] = '2.15.0'

為我工作。

詳細信息: Log4J2 漏洞和 Spring 引導

更多詳細信息: 為什么需要升級 log4j 版本

如果您的 pom.xml 中有以下內容:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.15.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.15.0</version>
</dependency>

確保兩者具有相同的版本。 我忘記了一個(離開了舊版本)並看到了同樣的錯誤。

  1. 設置 log4j2.version 屬性:
<properties>
    <log4j2.version>2.15.0</log4j2.version>
</properties>
  1. 修復 pom.xml:
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j2.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j2.version}</version>
</dependency>

對我有用的是排除log4j-apilog4j-core沖突版本的所有傳遞依賴項。
我已經通過以下方式追蹤了它們:
mvn dependency:tree -Dverbose -Dincludes=org.apache.logging.log4j:log4j-api

mvn dependency:tree -Dverbose -Dincludes=org.apache.logging.log4j:log4j-core
所以我確保2.15.0版本是整個項目中 log4j 依賴項的唯一版本。

Our old project have the same problem with 2.15.0or 2.16.0,then we try 2.12.2 is ok,and this also fix the security vulnerability。 here the log4j site: https://logging.apache.org/log4j/2 。X/

減輕

在 2.12.2 版本中,Log4j 默認禁用對 JNDI 的訪問。 現在需要顯式啟用配置中 JNDI 的使用。 對 JndiLookup 的調用現在將返回一個常量字符串。 此外,Log4j 現在默認將協議限制為僅 java。 郵件查找功能已完全刪除。

在 2.16.0 版本中,Log4j 默認禁用對 JNDI 的訪問。 現在需要顯式啟用配置中的 JNDI 查找。 Also, Log4j now limits the protocols by default to only java, ldap, and ldaps and limits the ldap protocols to only accessing Java primitive objects. 需要明確允許本地主機以外的主機。 郵件查找功能已完全刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM