og4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path解决最近在构建我的gradle项目添加日志时突然报错,具体报错如下SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, 阅读详情

注:下文中的“桥接”、“转调”、“绑定”等词基本都是同一个概念。

log4j-over-slf4j和slf4j-log4j12是跟java日志系统相关的两个jar包,当它们同时出现在classpath下时,就可能会引起堆栈溢出异常。异常信息大致如下(摘自slf4j官网文档Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError):

<span class="typ" style="color: rgb(102, 0, 102);">Exception</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">in</span><span class="pln"> thread </span><span class="str" style="color: rgb(0, 136, 0);">"main"</span><span class="pln"> java</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">lang</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">StackOverflowError</span><span class="pln">
  at java</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">util</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">Hashtable</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">containsKey</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">Hashtable</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">306</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">apache</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">log4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">Log4jLoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">getLogger</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln">Log4jLoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">36</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">apache</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">log4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">LogManager</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">getLogger</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">LogManager</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">39</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">slf4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">impl</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">Log4jLoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">getLogger</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln">Log4jLoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">73</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">slf4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">LoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">getLogger</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">LoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">249</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">apache</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">log4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">Category</span><span class="pun" style="color: rgb(102, 102, 0);">.<</span><span class="pln">init</span><span class="pun" style="color: rgb(102, 102, 0);">>(</span><span class="typ" style="color: rgb(102, 0, 102);">Category</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">53</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">apache</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">log4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">Logger</span><span class="pun" style="color: rgb(102, 102, 0);">..<</span><span class="pln">init</span><span class="pun" style="color: rgb(102, 102, 0);">>(</span><span class="typ" style="color: rgb(102, 0, 102);">Logger</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">35</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">apache</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">log4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">Log4jLoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">getLogger</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln">Log4jLoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">39</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">apache</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">log4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">LogManager</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">getLogger</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">LogManager</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">39</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">slf4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">impl</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">Log4jLoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">getLogger</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln">Log4jLoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">73</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">slf4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">LoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">getLogger</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">LoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">249</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">apache</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">log4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">Category</span><span class="pun" style="color: rgb(102, 102, 0);">..<</span><span class="pln">init</span><span class="pun" style="color: rgb(102, 102, 0);">>(</span><span class="typ" style="color: rgb(102, 0, 102);">Category</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">53</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">apache</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">log4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">Logger</span><span class="pun" style="color: rgb(102, 102, 0);">..<</span><span class="pln">init</span><span class="pun" style="color: rgb(102, 102, 0);">>(</span><span class="typ" style="color: rgb(102, 0, 102);">Logger</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">35</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">apache</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">log4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">Log4jLoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">getLogger</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln">Log4jLoggerFactory</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">39</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  at org</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">apache</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">log4j</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="typ" style="color: rgb(102, 0, 102);">LogManager</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">getLogger</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">LogManager</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">java</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="lit" style="color: rgb(0, 102, 102);">39</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln">
  subsequent lines omitted</span><span class="pun" style="color: rgb(102, 102, 0);">..</span><span class="pln">.</span>

现有日志体系

分析这个异常出现的具体原因之前,有必要先快速了解一下现有的Java日志体系。下图是现有Java日志体系的一个示意:

上图不是非常精准,但是能够比较清晰地展示现有Java日志体系的主体架构。Java日志体系大体可以分为三个部分:日志门面接口、桥接器、日志框架具体实现。

Java日志框架有很多种,最简单的是Java自带的java.util.logging,而最经典的是log4j,后来又出现了一个比log4j性能更好的logback,其他的日志框架就不怎么常用了。应用程序直接使用这些具体日志框架的API来满足日志输出需求当然是可以的,但是由于各个日志框架之间的API通常是不兼容的,这样做就使得应用程序丧失了更换日志框架的灵活性。

比直接使用具体日志框架API更合理的选择是使用日志门面接口。日志门面接口提供了一套独立于具体日志框架实现的API,应用程序通过使用这些独立的API就能够实现与具体日志框架的解耦,这跟JDBC是类似的。最早的日志门面接口是commons-logging,但目前最受欢迎的是slf4j。

日志门面接口本身通常并没有实际的日志输出能力,它底层还是需要去调用具体的日志框架API的,也就是实际上它需要跟具体的日志框架结合使用。由于具体日志框架比较多,而且互相也大都不兼容,日志门面接口要想实现与任意日志框架结合可能需要对应的桥接器,就好像JDBC与各种不同的数据库之间的结合需要对应的JDBC驱动一样。

需要注意的是,前面说过,上图并不精准,这只是主要部分,实际情况并不总是简单的“日志门面接口-->桥接器-->日志框架”这一条单向线。实际上,独立的桥接器有时候是不需要的,而且也并不是只有将日志门面API转调到具体日志框架API的桥接器,也存在将日志框架API转调到日志门面API的桥接器。

说白了,所谓“桥接器”,不过就是对某套API的伪实现。这种实现并不是直接去完成API所声明的功能,而是去调用有类似功能的别的API。这样就完成了从“某套API”到“别的API”的转调。如果同时存在A-to-B.jar和B-to-A.jar这两个桥接器,那么可以想象当应用程序开始调用A或者B的API时,会发生什么事。这就是最开始引出的那个stack overflow异常的基本原理。

slf4j的转接绑定

上面只是从整体上大概说了下Java现有日志体系,还看无法详细说明问题所在,需要进一步了解一下slf4j与具体日志框架的桥接情况。

slf4j桥接到具体日志框架

下图来自slf4j官网文档Binding with a logging framework at deployment time:

可以看到slf4j与具体日志框架结合的方案有很多种。当然,每种方案的最上层(绿色的应用层)都是统一的,它们向下都是直接调用slf4j提供的API(浅蓝色的抽象API层),依赖slf4j-api.jar。然后slf4j API向下再怎么做就非常自由了,几乎可以使用所有的具体日志框架。注意图中的第二层是浅蓝色的,看左下角的图例可知这代表抽象日志API,也就是说它们不是具体实现。如果像左边第一种方案那样下层没有跟任何具体日志框架实现相结合,那么日志是无法输出来的(这里不确定是否可能会默认输出到标准输出)。

图中第三层明显就不如第一、二层那么整齐划一了,因为这里已经开始涉及到了具体的日志框架。

首先看第三层中间的两个湖蓝色块,这是适配层,也就是桥接器。左边的slf4j-log4j12.jar桥接器看名字就知道是slf4j到log4j的桥接器,同样,右边的slf4j-jdk14.jar就是slf4j到Java原生日志实现的桥接器了。它们的下一层分别是对应的日志框架实现,log4j的实现代码是log4j.jar,而jul实现代码已经包含在了JVM runtime中,不需要单独的jar包。

再看第三层其余的三个深蓝色块。它们三个也是具体的日志框架实现,但是却不需要桥接器,因为它们本身就已经直接实现了slf4j API。slf4j-simple.jar和slf4j-nop.jar这两个不用多说,看名字就知道一个是slf4j的简单实现,一个是slf4j的空实现,平时用处也不大。而logback之所以也实现了slf4j API,据说是因为logback和slf4j出自同一人之手,这人同时也是log4j的作者。

第三层所有的灰色jar包都带有红框,这表示它们都直接实现了slf4j API,只是湖蓝色的桥接器对slf4j API的实现并不是直接输出日志,而是转去调用别的日志框架的API。

其它日志框架API转调回slf4j

如果只存在上面这些从sfl4j到其他日志框架的桥接器,可能还不会出什么问题。但是实际上还有另外一类桥接器,它们的作用跟上面的恰好相反,它们将其它日志框架的API转调到slf4j的API上。下图来自slf4j官网文档Bridging legacy APIs:

上图展示了目前为止能安全地从别的日志框架API转调回slf4j的所有三种情形。

以左上角第一种情形为例,当slf4j底层桥接到logback框架的时候,上层允许桥接回slf4j的日志框架API有log4j和jul。jcl虽然不是什么日志框架的具体实现,但是它的API仍然是能够被转调回slf4j的。要想实现转调,方法就是图上列出的用特定的桥接器jar替换掉原有的日志框架jar。需要注意的是这里不包含logback API到slf4j API的转调,因为logback本来就是slf4j API的实现。

看完三种情形以后,会发现几乎所有其他日志框架的API,包括jcl的API,都能够随意的转调回slf4j。但是有一个唯一的限制就是转调回slf4j的日志框架不能跟slf4j当前桥接到的日志框架相同。这个限制就是为了防止A-to-B.jar跟B-to-A.jar同时出现在类路径中,从而导致A和B一直不停地互相递归调用,最后堆栈溢出。目前这个限制并不是通过技术保证的,仅仅靠开发者自己保证,这也是为什么slf4j官网上要强调所有合理的方式只有上图的三种情形。

到这里,在开始所展示的那个异常的原理基本已经清楚了。此外,通过上图还可以看出可能会出现类似异常的组合不仅仅是log4j-over-slf4j和slf4j-log4j12,slf4j官网还指出了另外一对:jcl-over-slf4j.jar和slf4j-jcl.jar

代码示例

前面的分析都是理论上的,实际代码中即便同时使用了log4j-over-slf4j和slf4j-log4j12,也未必一定会出现异常。下面的代码调用slf4j的API输出日志,slf4j底层桥接到log4j:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package test;  
  2.   
  3. public class HelloWorld {  
  4.     public static void main(String[] args) {  
  5.         org.apache.log4j.BasicConfigurator.configure();  
  6.         org.slf4j.Logger logger = org.slf4j.LoggerFactory  
  7.                 .getLogger(HelloWorld.class);  
  8.         logger.info("Hello World");  
  9.     }  
  10. }  

配置classpath上的jar包为(注意log4j在log4j-over-slf4j之前):

在这种情况下运行测试程序是能够正常输出日志的,不会出现stack overflow异常。但是如果调整classpath上的jar顺序为:

再运行测试程序就出现类似于本文最开始的stack overflow异常了,可以看到明显的周期性重复:

序列图分析

上图是堆栈溢出的详细调用过程序列图。从调用1开始,依次调用1.1、1.1.1……最后到了1.1.1.1.1.1(图中最后一个调用)的时候,发现它跟1是完全一样的,那么后续的过程就是完全一样的重复了。

需要特别说明的是最开始的导火索并不只有图中所示的LoggerFactory.getLogger()一种,应用程序中能够触发堆栈溢出异常的直接调用还有好几种其它的,比如前面示例代码中触发异常的实际上是第一条语句org.apache.log4j.BasicConfigurator.configure(),但后续的互相无限递归调用过程基本都是跟上图相同的过程。


java 新引入jar包冲突—log4j 报错 Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar 阅读详情

相关推荐

log4j-over-slf4j的jar包适配原理解析

如果想把项目中的日志实现统一成slf4j的话,则需要把第三方一些依赖包中的日志包去掉,例如Spring中的jcl,或者其他的像早期的log4j,如果直接排除,则程序肯定会运行报错,此时需要引入适配包,这个适配包就是一个狸猫换太子包,这个包有着和jcl和log4j一摸一样的包名和类名,所以在程序动态运行过程中,只需要关心classpath下有没有这个类即可,并不需要知道这个类在哪个jar包,正因如此,才能实现狸猫换太子的功能。下面写一个测试程序:最开始是先有的jcl这个包,然后这个包中依赖log4j这个包,在

qq_43750656的博客 2850

log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

log4j-over-slf4j和slf4j-log4j12是跟java日志系统相关的两个jar包,当它们同时出现在classpath下时,就可能会引起堆栈溢出异常。 先大致梳理了一下现有Java日志体系接口,然后仔细分析了这种异常出现的原因,最后重现异常并展示了详细的调用过程。

kxcfzyk的专栏 3万+

ADS1293心电图模块实战:从电极贴片到信号采集的全流程指南

本文提供了一份基于TI ADS1293芯片的心电图采集系统全流程实战指南。文章深入探讨了从电极贴片选择与皮肤预处理、ADS1293前端配置(包括PGA、RLD和威尔逊网络),到PCB布局、电源去耦以及固件滤波与运动伪影处理等关键环节,旨在帮助硬件工程师和嵌入式开发者构建稳定可靠的可穿戴心电监测设备。

weixin_29201313的博客 387

解决java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on

在选择移除或排除哪个库的依赖时,需要根据自己的项目需求和使用习惯来决定。​(Simple Logging Facade for Java)是一个简单的日志门面,它提供了一个统一的API,可以用于不同的日志框架。其中一个常见的问题是在依赖库中出现了相互冲突的情况,比如在使用日志框架时可能会出现​。解决这个问题的方法很简单,我们只需要移除或者排除其中一个库的依赖即可。这个问题的根本原因是存在两个不同的日志框架冲突,分别是​。​异常,可以考虑检查项目的依赖中是否存在​。​作为日志框架,可以移除或者排除​。

牛肉胡辣汤 1673

ArcGIS小白必看:5分钟搞定shp矢量文件分割(附常见错误排查)

本文为ArcGIS新手详细解析了分割shp矢量文件的四种核心方法:裁剪工具、分割工具、按属性选择导出及ArcPy脚本自动化。重点强调了投影匹配等关键步骤,并提供了常见错误排查指南,帮助用户快速掌握矢量数据分割技巧,提升GIS数据处理效率。

h9j8k7l6m5n的博客 802

JESD204B Subclass 1的SYSREF机制

SYSREF 是一个系统级同步脉冲信号,用于对齐 JESD204B 中的 LMFC(Local Multi-Frame Clock),从而实现每次建链的延迟一致性。核心点内容说明是系统参考跨多个芯片、多通道实现精确同步控制 LMFC决定所有设备的 LMFC 对齐点仅用于 Subclass 1是 JESD204B 实现确定性延迟的前提条件一般通过时钟芯片生成推荐使用 AD9528、LMK04828,支持 JESD204 专用输出建链过程中关键作用。

weixin_41230430的博客 1832

log4j-over-slf4j与slf4j-log4j12共存stack overflow异常

使用maven构建项目时,如果项目中有log4j的依赖,在运行程序时可能会出现在同一个类中log4j-over-slf4j.jar和 slf4j-log4j12.jar冲突的问题: 项目报错内容为: Exception in thread "main" java.lang.ExceptionInInitializerError at org.apache.log4j.Lo...

伏虎游侠的博客 1643

Wine7.22实战:如何在Ubuntu上完美运行通达信和微信(附字体配置技巧)

本文详细介绍了如何在Ubuntu系统上使用Wine7.22版本,完美运行通达信和微信这两款Windows专属软件。通过选择稳定的Wine7.22版本、利用现成的兼容容器,并重点解决了中文字体渲染的核心难题,提供了从环境搭建、字体配置到软件安装调优的一站式实战指南,帮助用户在Linux环境下无缝使用关键金融与通讯工具。

weixin_29280657的博客 551

[转载] log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

参考链接: log4j-示例程序 注:下文中的“桥接”、“转调”、“绑定”等词基本都是同一个概念。 log4j-over-slf4j和slf4j-log4j12是跟java日志系统相关的两个jar包,当它们同时出现在classpath下时,就可能会引起堆栈溢出异常。异常信息大致如下(摘自slf4j官网文档Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflo..

u013946150的博客 482

华为 MetaERP · 本体论驱动的 PTP 全流程智能建模方案

华为MetaERP通过“本体+事件+图谱+Agent”四位一体架构,将传统ERP从“记录系统”升级为“智能执行系统”。基于OWL本体实现业务语义精准表达,融合LLM与元数据多租能力,构建可推理、可治理的PTP全流程智能模型,解决AI理解业务逻辑难题,实现三单匹配自动化、关账效率提升30%、成本降低50%,推动企业数字化迈向可信智能新范式。

金牌架构师 182

基于SSD2828和STM32的MIPI显示屏驱动系统设计与实现

在硬件层面,需要将STM32、SSD2828和MIPI显示屏连接起来。STM32与SSD2828的连接:通过SPI接口连接STM32和SSD2828,用于配置和控制SSD2828。SSD2828与MIPI显示屏的连接:通过MIPI DSI接口连接SSD2828和MIPI显示屏,用于传输显示数据。

qq_38334677的博客 7151

[转] log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

[转] log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

qq_38472465的博客 75

2026华为OD机试(C++)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,C++实现。

MISAYAONE的博客 20万+
上一篇: Commons Email 发送 HtmlEmail失败原因分析
下一篇: SLF4J 的几种实际应用模式--之一:SLF4J+Log4J
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值