ClassCircularityError:使用JavaMelody和Tomcat插件运行Gradle webapp的java / util / logging / LogRecord

时间:2014-05-30 20:37:42

标签: tomcat gradle slf4j tomcat-juli

当我尝试使用Gradle Tomcat plugin的嵌入式容器启动我的应用时,我正在获得下面的堆栈跟踪。

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':tomcatRun'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
...
Caused by: java.lang.ClassCircularityError: java/util/logging/LogRecord
    at net.bull.javamelody.LoggingHandler.publish(LoggingHandler.java:109)
    at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:183)
    at org.apache.juli.logging.DirectJDKLog.debug(DirectJDKLog.java:106)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:369)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:153)
    at org.apache.catalina.startup.Tomcat.start(Tomcat.java:341)
    at org.apache.catalina.startup.Tomcat$start.call(Unknown Source)
    at org.gradle.api.plugins.tomcat.embedded.BaseTomcatServerImpl.start(BaseTomcatServerImpl.groovy:37)
...

当我使用外部Tomcat时不会发生这种情况,所以我希望它与Gradle的类路径和Gradle的内置依赖关系有关(我甚至不知道如何找出它们是什么)。我已经戳了一下,人们似乎similar problems以某种方式与SLF4J和/或Logback有关,这两者都不是我的项目使用的。我试图用SLF4J legacy bridges来解决这个问题,但无济于事 - 可能是因为我在我的build.gradle中宣布它们,而且那时已经太晚了(Gradle本身已经进入/配置SLF4J)。

从理论上讲,理论上可以禁用JULI并使Tomcat登录到log4j,这似乎有可能解决问题,但the instructions都与手动替换{中的JARs有关。 {1}}和$CATALINA_HOME/bin,我不知道如何在Gradle上下文中实现这一点。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

最简单的修复原来是阻止Tomcat使用java.util.logging并让它使用Log4J。

在我的build.gradle

  tomcat "org.apache.tomcat.embed:tomcat-embed-logging-log4j:${tomcatVersion}"
  // tomcat "org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}"