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
相关产品推荐
相关产品推荐

