【问题标题】:Spring Boot REST service - throws java.lang.NoClassDefFoundError: org/apache/tomcat/util/ExceptionUtilsSpring Boot REST 服务 - 抛出 java.lang.NoClassDefFoundError: org/apache/tomcat/util/ExceptionUtils
【发布时间】:2015-01-08 15:31:50
【问题描述】:

在开发过程中,REST 服务(Spring Boot 1.1.18)似乎一切正常,但是当我们执行不同的性能和负载测试时,服务停止响应并出现以下错误:

org.apache.tomcat.util.net.NioEndpoint log - 
java.lang.NoClassDefFoundError: org/apache/tomcat/util/ExceptionUtils
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:711) ~[tomcat-embed-core-7.0.55.jar!/:7.0.55]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) [tomcat-embed-core-7.0.55.jar!/:7.0.55]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695) [tomcat-embed-core-7.0.55.jar!/:7.0.55]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_55]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_55]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-7.0.55.jar!/:7.0.55]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_55]

测试涵盖了这个工作流程:

  • 1) 登录
  • 2) 从数据库中获取信息
  • 3) 从文件中解析信息(驻留在服务主机上)
  • 步骤 2) 和 3) 使用 5 个运行线程重复 2000 次

服务没有完全崩溃,它仍然可以通过 JMX 访问,但不响应 HTTP - 请求。

我正在寻找一个原因,但没有运气。

更新:

我为堆、堆栈调整和永久代大小添加了 JAVA_OPTS,现在服务稳定且性能更好。

-Xmx768m -Xms512m -Xss4m  -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=128m -XX:PermSize=128m

这很好,但为什么呢?

更新:

没有任何帮助,错误仍然存​​在,Sprint Boot 1.2.0 也是如此

【问题讨论】:

  • 这很奇怪。 org.apache.tomcat.util.ExceptionUtils 在 tomcat-embed-core jar 中,从您发布的堆栈跟踪中,我可以看到您正在使用。这是完整的堆栈跟踪还是 NoClassDefFoundError 的原因?
  • 这是完整的堆栈跟踪,它发生在服务没有响应时。 HTTP 线程处于 TIMED_WAITING 阶段,没有线程被终止。
  • 有一个issue on Spring Boot 似乎会在 .jar 仍在运行时被替换时触发类似的异常。您正在运行的测试中也会发生这种情况吗?

标签: java tomcat spring-boot


【解决方案1】:

你有没有在源码目录下运行过“gradle clean”或者“mvn clean”,可以去掉spring boot生成的fat jar,应该是这个异常的根本原因。由于正在运行的 jvm 找不到被删除的类文件。

【讨论】:

    【解决方案2】:

    如果你重新打包fat spring-boot JAR文件,subjars的开头位置会改变。当您更改 fat-jar 中的属性文件/xml 中的某些内容时,就会发生这种情况。当您使用 mc (mcedit) 应用程序编辑配置文件中的某些内容时,您会这样做。将您的配置文件放在 fat jar 之外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2018-12-16
      • 2015-03-14
      • 2013-10-18
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多