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

时间:2013-11-21 10:00:57

标签: java jar

我在我的项目中使用了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文件用作库以解决日志记录问题。 有没有人遇到同样的问题。如果这样善意写出建议或解决方案来摆脱这个烂摊子。 提前致谢。

8 个答案:

答案 0 :(得分:67)

因此您必须排除冲突依赖性。试试这个:

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

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

答案 1 :(得分:2)

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

简单的答案是否定的。

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

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

参考:


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

答案 2 :(得分: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

Reference Libraries

您可以从这里查看xuggler需要的依赖项:

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

**版本号可能会改变

答案 3 :(得分:1)

对于gradle

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

遇到类似的错误,这就是我的解决方法:

  1. 访问Netbeans IDE 8.2上的项目资源管理器视图。进入依赖项下的项目,将光标悬停在log4j-over-slf4j.jar上,以查看间接导入了哪些依赖项,如下所示。 enter image description here

  2. 右键单击导入jar文件,然后选择“排除依赖关系” enter image description here

  3. 要确认,请打开pom.xml文件,您将注意到以下排除元素。

enter image description here 4.启动maven全新安装并运行您的项目。祝你好运!

答案 6 :(得分:0)

上面提到的SBT解决方案对我不起作用。对我有用的是排除slf4j-log4j12

//dependencies with exclusions
libraryDependencies ++= Seq(
    //depencies
).map(_.exclude("org.slf4j","slf4j-log4j12"))

答案 7 :(得分:0)

必须排除log4j-over-slf4j

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