当我尝试使用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上下文中实现这一点。
有什么想法吗?
答案 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}"