【问题标题】:ClassCircularityError when running Tomcat 6 from Eclipse从 Eclipse 运行 Tomcat 6 时出现 ClassCircularityError
【发布时间】:2011-02-09 00:54:49
【问题描述】:

我使用的是 Eclipse 3.5,我的 Tomcat 运行时设置为 Tomcat 6.0.26。我的 Java VM 是 JDK 1.6.17 (Mac OS X)。

当我尝试从 Eclipse Java EE 角度运行 Web 应用程序时,我一直在控制台中看到此错误:

Caused by: java.lang.ClassCircularityError: java/util/logging/LogRecord
 at com.adsafe.util.SimpleFormatter.format(SimpleFormatter.java:11)
 at java.util.logging.StreamHandler.publish(StreamHandler.java:179)
 at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:88)
 at java.util.logging.Logger.log(Logger.java:458)
 at java.util.logging.Logger.doLog(Logger.java:480)
 at java.util.logging.Logger.logp(Logger.java:596)
 at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:165)
 at org.apache.juli.logging.DirectJDKLog.info(DirectJDKLog.java:115)
 at org.apache.catalina.core.ApplicationContext.log(ApplicationContext.java:644)
 at org.apache.catalina.core.ApplicationContextFacade.log(ApplicationContextFacade.java:251)
 at org.apache.catalina.core.StandardWrapper.unavailable(StandardWrapper.java:1327)
 at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1130)
 at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993)
 at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4187)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4496)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
 at org.apache.catalina.core.StandardService.start(StandardService.java:519)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
 ... 6 more

java/util/logging/LogRecord 实现了 Serializable,所以我不确定循环引用可能在哪里蔓延。

有没有人见过这个并且知道如何解决这个问题?

【问题讨论】:

标签: java tomcat


【解决方案1】:

我可以通过将<contextListener ...> 移动到配置文件的最末尾来绕过这个问题(以前,我将它放在文件的开头)。不过,这个错误仍然很奇怪。

【讨论】:

    【解决方案2】:

    如果你将这个 sn-p 插入到你的 logback 配置中,问题就解决了:

    <!-- LEVEL CAN NOT BE DEBUG -->
    <logger name="org.apache" level="INFO"></logger>
    

    【讨论】:

    • 谢谢。这很好用。你甚至可以只为org.apache.catalina
    【解决方案3】:

    我不知道为什么这解决了问题,但是将默认级别设置为 INFO 让这对我来说消失了

    .level = 信息

    【讨论】:

    • 这是因为Webapp类加载器加载logger类的时候会出现循环错误。这样做,它会向日志输出一条调试消息。为此,它需要加载记录器类。这样做......你会看到这是怎么回事。将日志级别设置为 INFO 会抑制调试日志条目 -> 避免循环。
    【解决方案4】:

    In 使用 Logback 时出现同样的错误。

    就我而言,问题在于我在 Logback 配置文件中使用了 JUL LevelChangePropagator。

    所以我只需要删除以下监听器

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>
    

    【讨论】:

    • 删除 LevelChangePropagator 可能会导致性能问题:slf4j.org/legacy.html#jul-to-slf4j
    • @BradCupit 我也有这个错误(出于性能原因不想停止使用 LevelChangePropagator)。虽然我很难相信,但 Meriton 的解决方案(如下)对我有用并让我保留了它。
    【解决方案5】:

    首先,一点上下文:我个人在我的web.xml 添加一个侦听器以安装SLF4JBridgeHandler 以桥接java.util.logging (JUL) 调用到 SLF4J 时看到此消息。当我将 JUL 根记录器级别从默认 (INFO) 增加到 FINE 时,我就开始看到这一点,以便将所有(嗯,几乎所有)消息转发到 SLF4J。

    上面的user2543253评论确实很有用,这是在类加载时发生的问题。我个人通过在安装 SLF4JBridgeHandler 之前添加一个假的直接 JUL 日志调用(使用LogRecord)来解决它,以便及早触发 JUL 类的类加载。所以我的听众现在这样做了:

    java.util.logging.Logger rootLogger = LogManager.getLogManager().getLogger("");
    rootLogger.log(new LogRecord(Level.ALL, "bridging of java.uil.logging to SLF4J requested"));
    SLF4JBridgeHandler.removeHandlersForRootLogger();
    rootLogger.setLevel(Level.FINE);
    SLF4JBridgeHandler.install();
    

    顺便说一句:这不是严格意义上的 Logback 问题,我在完全不使用 Logback 时遇到了这个问题(我使用的是 Log4j 1.2 绑定)。

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 2014-04-30
      • 2013-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多