4

当我尝试使用Gradle Tomcat 插件的嵌入式容器启动我的应用程序时,我得到了下面的堆栈跟踪。

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 的内置依赖项有关(我什至不知道如何找出它们是什么)。我已经摸索了一下,人们似乎在某种程度上与 SLF4J 和/或 Logback有类似的问题,我的项目都没有使用它们。我曾尝试使用SLF4J 遗留网桥解决它,但无济于事——可能是因为我在我build.gradle的文件中声明了它们,而那时为时已晚(Gradle 本身已经拉入/配置了 SLF4J)。

从理论上讲,似乎也可以禁用 JULI 并使 Tomcat 登录到 log4j,这似乎有可能解决问题,但说明都与手动替换 and 中的 JAR 有关$CATALINA_HOME/bin$CATALINA_HOME/lib而我没有第一个想法是如何在 Gradle 上下文中实现这一点。

有任何想法吗?

4

1 回答 1

3

最简单的解决方法是停止使用 Tomcatjava.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}"
于 2014-06-03T00:02:43.760 回答