令人困惑的logback bug TimeBasedArchiveRemover $ ArhiveRemoverRunnable

时间:2017-02-24 19:22:47

标签: java logging logback noclassdeffounderror

Logback 1.1.7

这是在"生产" run:来自Exception的堆栈跟踪(实际上NoClassDefFoundErrorError):

Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover$ArhiveRemoverRunnable
        at ch.qos.logback.core.rolling.helper.TimeBasedArchiveRemover.cleanAsynchronously(TimeBasedArchiveRemover.java:231)
        at ch.qos.logback.core.rolling.TimeBasedRollingPolicy.rollover(TimeBasedRollingPolicy.java:178)
        at ch.qos.logback.core.rolling.RollingFileAppender.attemptRollover(RollingFileAppender.java:204)
        at ch.qos.logback.core.rolling.RollingFileAppender.rollover(RollingFileAppender.java:183)
        at ch.qos.logback.core.rolling.RollingFileAppender.subAppend(RollingFileAppender.java:224)
        at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:100)

所以我查看了源代码:类ArhiveRemoverRunnable确实存在于.java文件中,它应该在l上实例化。 231(错误拼写)......

然后我解压缩了可执行jar(logback-core-1.1.7.jar):同样,包中存在 TimeBasedArchiveRemover $ ArhiveRemoverRunnable.class 文件,文件 TimeBasedArchiveRemover也是如此。类

这种错误通常不会发生:很明显,当"滚动"记录器决定是时候清理目录了。

任何人都知道为什么会这样?令人不安的是,我没有发现任何其他人遇到这种情况的证据......!

1 个答案:

答案 0 :(得分:0)

潜在的解决方法(待定):

我认为对此的答案可能是提取此.jar的源文件,编辑有问题的类,编译并重新打包为可执行jar,然后使用而不是下载的jar。为了做到这一点,我在Eclipse中启动了一个新的Gradle项目,导入了整个源代码包等。这个东西在Eclipse-with-Gradle中编译(构建)OK,没有任何关于" NoClassDef"键入...

但我实际上制作这个可执行jar有困难。能够完成它是一件好事:能够以某种方式调整和测试下载的依赖项(如果真的有必要)。

当前不太令人满意的解决方法:

事实上,我不需要基于时间的"档案移除。我很高兴根据日志记录目录中所有文件的大小删除档案。 This answer似乎可以解决这个问题。然而,logback是一个野兽:我不完全确定:"存档删除"与"翻转"?

相同

如果再次出现 <?php if (has_post_thumbnail()) { ?> <?php the_post_thumbnail(); ?> <?php } else { ?> <img src="<?php echo first_image_as_featured(); ?>" /> <?php } ?> ,我必须使用一种特殊的实用工具方法来记录Error内的每个LOGGER.xxx命令。