You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8 Spring Boot部署Tomcat时加载FastStringService失败求助

问题:Tomcat部署Spring Boot WAR包时Groovy JsonSlurper加载FastStringService失败

我有一个基于Java 8的Spring Boot应用,依赖groovy-json 3.0.19库执行Groovy脚本。将WAR包部署到Tomcat 9.0.71时出现异常,但在Docker或本地开发环境完全正常。执行new groovy.json.JsonSlurper().parseText('{}')这类脚本时,抛出异常:
javax.script.ScriptException: java.lang.RuntimeException: Unable to load FastStringService

异常来自groovy-json包中FastStringUtils类的getService方法,该逻辑通过ServiceLoader加载FastStringService实现类,加载失败时抛出此异常。

已排查依赖冲突,应用中仅存在3.0.19版本的groovy-json库,涉及的类也确实存在于WAR包中。

附加堆栈追踪:

Caused by: java.lang.RuntimeException: Unable to load FastStringService
  at org.apache.groovy.json.internal.FastStringUtils.getService(FastStringUtils.java:56)
  at org.apache.groovy.json.internal.FastStringUtils.toCharArray(FastStringUtils.java:66)
  at org.apache.groovy.json.internal.BaseJsonParser.parse(BaseJsonParser.java:113)
  at groovy.json.JsonSlurper.parseText(JsonSlurper.java:204)
  at groovy.json.JsonSlurper$parseText.call(Unknown Source)
  at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
  at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
  at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
  at Script449.run(Script449.groovy:2)
  at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:317)
  ... 155 more
解决思路
  • 检查ServiceLoader配置文件:确认WAR包中META-INF/services/org.apache.groovy.json.internal.FastStringService文件是否存在,文件内容是否为org.apache.groovy.json.internal.DefaultFastStringService。若文件缺失,手动添加或重新打包groovy-json依赖。
  • 显式设置脚本引擎类加载器:Tomcat的类加载器隔离可能导致ServiceLoader无法找到实现类,在初始化Groovy脚本引擎时指定当前应用的类加载器:
    GroovyScriptEngineImpl engine = new GroovyScriptEngineImpl();
    engine.setClassLoader(Thread.currentThread().getContextClassLoader());
    
  • 禁用FastParser优化:直接关闭JsonSlurper的快速解析模式,绕开FastStringService的加载逻辑:
    def slurper = new groovy.json.JsonSlurper()
    slurper.disableFastParser()
    def result = slurper.parseText('{}')
    
  • 检查Tomcat安全权限:若Tomcat启用了SecurityManager,检查catalina.policy文件,确保应用拥有读取自身JAR包中META-INF/services目录的权限,添加类似权限配置:
    grant codeBase "file:${catalina.base}/webapps/your-app/-" {
        permission java.io.FilePermission "META-INF/services/-", "read";
    };
    
  • 升级Groovy版本:该问题可能是3.0.19版本的已知问题,尝试升级到3.0.x系列的后续稳定版本(如3.0.20+),查看官方修复记录。
  • 确认Spring Boot打包配置:确保groovy-json依赖被正确打包到WEB-INF/lib目录,在pom.xml中设置其scope为compile,避免依赖被排除或被Tomcat全局类加载器加载。

内容的提问来源于stack exchange,提问作者Apoorva Manjunath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:05:37