在类路径上检测到log4j-over-slf4j.jar和slf4j-log4j12.jar,抢占StackOverflowError。

问题描述 投票:50回答:6

我在我的项目中使用了xuggle library来转换来自mp4 to flv的视频。我也使用slf4j libraries来支持日志记录结束。

import com.xuggle.mediatool.IMediaReader;
import com.xuggle.mediatool.IMediaViewer;
import com.xuggle.mediatool.IMediaWriter;
import com.xuggle.mediatool.ToolFactory;

public class TranscodingExample {

    private static final String inputFilename = "E:\\VIDEO\\Facebook.mp4";
    private static final String outputFilename = "E:\\VIDEO\\Facebook.flv";

    public static void main(String[] args) {

        // create a media reader
        IMediaReader mediaReader = 
               ToolFactory.makeReader(inputFilename);

        // create a media writer
        IMediaWriter mediaWriter = 
               ToolFactory.makeWriter(outputFilename, mediaReader);

        // add a writer to the reader, to create the output file
        mediaReader.addListener(mediaWriter);

        // create a media viewer with stats enabled
        IMediaViewer mediaViewer = ToolFactory.makeViewer(true);

        // add a viewer to the reader, to see the decoded media
        mediaReader.addListener(mediaViewer);

        // read and decode packets from the source file and
        // and dispatch decoded audio and video to the writer
        while (mediaReader.readPacket() == null) ;

    }

}

我在这里得到一个错误

"Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError.". 

我已将两个jar文件用作库以解决日志记录问题。有没有人遇到同样的问题。如果这样善意写出建议或解决方案来摆脱这个烂摊子。提前致谢。

java jar
6个回答
67
投票

所以你必须排除冲突依赖。试试这个:

<exclusions>
  <exclusion> 
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
  </exclusion>
  <exclusion> 
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
  </exclusion>
</exclusions> 

这解决了slf4j和Dozer的相同问题。


2
投票

您询问是否可以更改这些slf4j类中的循环依赖性检查。

简单回答是不。

  • 这是无条件的...已实施。
  • 它是在static初始化程序块中实现的...因此您无法覆盖实现,并且无法阻止它发生。

因此,改变这种情况的唯一方法是下载源代码,修改核心类以“修复”它们,构建和使用它们。这可能是一个坏主意(一般而言),在这种情况下可能不是解决方案;即你有可能触发消息警告的堆栈溢出问题。

参考:


真正的解决方案(正如您在答案中所确定的)是使用正确的JAR。我的理解是,检测到的循环性是真实的并且可能存在问题......并且是不必要的。


1
投票

我得到了解决方案

在这里下载Xuggler 5.4

还有一些罐子让它起作用......

公共-CLI-1.1.jar

公地郎2.1.jar

的logback经典-1.0.0.jar

的logback核-1.0.0.jar

SLF4J-API-1.6.4.jar

您可以从这里检查xuggler需要哪些依赖项:

将此jar和xuggle-xuggler-5.4.jar添加到项目的构建路径中并准备就绪。

**版本号可能会改变


1
投票

为了gradle

compile('org.xxx:xxx:1.0-SNAPSHOT'){
    exclude module: 'log4j'
    exclude module: 'slf4j-log4j12'
}

1
投票

而对于SBT:excludeDependencies += "log4j" % "log4j"


0
投票

遇到类似的错误,这是我如何解决它:

  1. 在Netbeans IDE 8.2上访问Project Explorer视图。继续执行Dependencies下的项目,将光标悬停在log4j-over-slf4j.jar上,以查看间接导入的依赖项,如下所示。 enter image description here
  2. 右键单击导入jar文件,然后选择Exclude Dependency enter image description here
  3. 要确认,请打开您的pom.xml文件,您将注意到排除元素,如下所示。

enter image description here 4.启动maven clean install并运行您的项目。祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.