龙空技术网

Graal Native Image 编译 Log4j 异常怎么办

阿呜的边城 88

前言:

今天你们对“log4j异常”都比较注重,咱们都需要学习一些“log4j异常”的相关内容。那么小编同时在网络上汇集了一些有关“log4j异常””的相关文章,希望我们能喜欢,看官们快快来学习一下吧!

在我们将 Java 项目编译为 Native Image 时,我们可能遇到类似如下的错误:

Caused by: com.oracle.graal.pointsto.constraints.UnsupportedFeatureException: No instances of org.apache.logging.slf4j.SLF4JLogger are allowed in the image heap as this class should be initialized at image runtime. Object has been initialized by the org.hibernate.internal.util.SerializationHelper class initializer with a trace:

一般我们如果要将 Java 项目编译为 Native Image 时,常会选择云原生框架,如 Quarkus、Micronaut 或 Spring Boot 3。这些框架本身对 Native Image 的支持已经很好了,但我们总会引用一些其他的开源包,所以遇到以上的问题也是常见的。

遇到以上类似异常时,编译异常会提示我们向编译参加中添加:

--initialize-at-build-time=org.apache.logging.slf4j.SLF4JLogger

以上参数用于直接在编译时初始化相应的实例,但由于像 SLF4JLogger 这种没有构造函数的类使用此方法是不可行的。

我们可以采用另一种方法,比如直接初始化整个包:

--initialize-at-build-time=org.apache.logging

如果以上方法不行, 我们可以尝试将 SFL4j 的实现替换为 Logback,可以使用桥接依赖:log4j-over-slf4j

很多情况下的类似编译异常通过以上方法就解决了。如果还没有解决进一步分析,比如我们这个异常原因是 org.hibernate.internal.util.SerializationHelper 触发的,原因是它要初始化一个 Logger,但是失败了。所以根因是需要对 hibernate 的 Logger 进行初始化,经过分析资料我们可以尝试添加相关的依赖:

implementation("org.jboss.logging:commons-logging-jboss-logging")implementation("org.jboss.logmanager:log4j-jboss-logmanager")implementation("org.jboss.slf4j:slf4j-jboss-logmanager")

以上提供一种解决类似问题的思路,遇到具体问题,需要具体问题具体分析。

标签: #log4j异常