当我尝试使用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 上下文中实现这一点。
有任何想法吗?