无法从 dropwizard 项目中排除 logback-classic 依赖项

Can't exclude logback-classic dependency from dropwizard project

我正在处理一些使用 Dropwizard 0.8.2 和 sfl4j-api 1.7.12 进行日志记录的项目。我们为 slf4j 选择的实现是 slf4j-log4j12,但我们在项目中存在多个实现时遇到问题。

当尝试 运行 它时,它抱怨存在多个 SLF4J 绑定。一个是我们的,另一个是来自 dropwizard-jackson 依赖项的 logback-classic。

问题是当我们尝试从依赖项中排除 logback-classic 时,我们在尝试启动服务器时遇到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/classic/filter/ThresholdFilter
    at io.dropwizard.Application.<clinit>(Application.java:20)
Caused by: java.lang.ClassNotFoundException: ch.qos.logback.classic.filter.ThresholdFilter
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

人们知道有什么方法可以将 log4j 与 Dropwizard 一起使用吗?

我认为您不能从运行时 classpath 中删除 logback 并使 dropwizard 使用其他一些日志记录实现(不修改 dropwizard 的代码)。正如我们所见,io.dropwizard.Application 的静态初始化程序 calls io.dropwizard.logging.LoggingFactory.bootstrap(), and LoggingFactory 直接使用来自 logback 的 classes,因此 LoggingFactory class 没有 logback 就不会初始化。