Java Logback FilterReply上的ClassCircularityError

Java Logback FilterReply上的ClassCircularityError,java,jetty,classloader,Java,Jetty,Classloader,我们遇到了Java类加载机制的一些非常奇怪的行为。在实现Logback的TurboFilter时,我得到了ClassCircularityError。我有以下简单的实现: public class ActivatingTurboFilter extends TurboFilter { [...] @Override public FilterReply decide(Marker marker, Logger logger,

我们遇到了Java类加载机制的一些非常奇怪的行为。在实现Logback的
TurboFilter
时,我得到了
ClassCircularityError
。我有以下简单的实现:

public class ActivatingTurboFilter extends TurboFilter {

  [...]
  @Override
  public FilterReply decide(Marker marker, Logger logger,
                            Level level, String format, Object[] params,
                            Throwable t) {
    if (!expectedValue.equals(MDC.get(key)))
      return NEUTRAL;
    return isLevelAndLoggerValid(level, logger.getName()) ? ACCEPT : NEUTRAL;
  }
}
应用程序作为WAR文件部署在Jetty/9.2.10上。调用
decise()
方法时,我得到:

java.lang.ClassCircularityError: ch/qos/logback/core/spi/FilterReply
    at me.bazhenov.whisperer.ActivatingTurboFilter.decide(ActivatingTurboFilter.java:33)
    at ch.qos.logback.classic.spi.TurboFilterList.getTurboFilterChainDecision(TurboFilterList.java:62)
    at ch.qos.logback.classic.LoggerContext.getTurboFilterChainDecision_0_3OrMore(LoggerContext.java:252)
    at ch.qos.logback.classic.Logger.callTurboFilters(Logger.java:772)
    at ch.qos.logback.classic.Logger.isTraceEnabled(Logger.java:644)
    at ch.qos.logback.classic.Logger.isTraceEnabled(Logger.java:640)
    at org.apache.commons.logging.impl.SLF4JLocationAwareLog.isTraceEnabled(SLF4JLocationAwareLog.java:60)
    at org.apache.activemq.transport.failover.FailoverTransport.handleTransportFailure(FailoverTransport.java:208)
    at org.apache.activemq.transport.failover.FailoverTransport$3.onException(FailoverTransport.java:186)
    at org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
    at org.apache.activemq.transport.WireFormatNegotiator.onException(WireFormatNegotiator.java:160)
    at org.apache.activemq.transport.InactivityMonitor.onException(InactivityMonitor.java:255)
    at org.apache.activemq.transport.TransportSupport.onException(TransportSupport.java:96)
    at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:205)
    at java.lang.Thread.run(Thread.java:745)
一些补充资料:

  • 异常在
    ActivatingTurboFilter.java:33
    上抛出,这是
    FilterReply所在的行。返回空档
  • 在方法调用时,已加载enum
    FilterReply
    。使用
    -verbose:class
    日志记录和
    jmap-histo
    中的实例计数进行确认
  • 后勤保障(1.1.2版)不是应用程序的一部分,而是码头安装的一部分。所以它位于Jetty home dir的
    lib
    目录中
  • 只有一个Logback实例提供给应用程序(因此,
    FilterReply
    只有一个定义可用)。使用
    -verbose:class
    日志记录以及
    查找确认-name\*.jar | xargs-n1 zipinfo | grep-i FilterReply
    (在Jetty home目录和WAR文件内容中)
我怀疑Jetty类加载过程中有一些奇怪的地方,因为如果我在任何线程中调用这个方法,除了Jetty请求处理线程(所谓的
qtp
threads),所有这些都可以正常工作


我想不出去哪里找原因了。

你有没有想过?