从Eclipse运行Tomcat 6时的ClassCircularityError

时间:2010-04-16 23:13:39

标签: java tomcat

我正在使用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 实现可序列化,所以我不确定循环引用可能在哪里。

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

5 个答案:

答案 0 :(得分:7)

我能够通过将<contextListener ...>移动到配置文件的最后来解决这个问题(之前,我在文件的开头有了它)。但错误仍然非常奇怪。

答案 1 :(得分:3)

我不确定为什么这样可以解决问题,但是将默认级别设置为INFO会让我失望

.level = INFO

答案 2 :(得分:3)

如果将此代码段插入到您的回溯配置中,问题就解决了:

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

答案 3 :(得分:2)

使用Logback时出现相同的错误。

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

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

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

答案 4 :(得分:0)

首先,一些上下文:我个人在 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 绑定)。