升级Tomcat 9遇JasperException:JSP编译失败,配置参数无效
问题现象
升级应用到Tomcat 9后,出现org.apache.jasper.JasperException错误,提示无法编译JSP类,具体错误为泛型语法要求源码级别不低于1.5/1.7。
错误日志
05-Feb-2025 13:18:08.986 SEVERE [http-nio-8080-exec-7] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [jsp] in context with path [/clover_portal] threw exception [Unable to compile class for JSP: An error occurred at line: [24] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater An error occurred at line: [26] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater An error occurred at line: [28] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater An error occurred at line: [31] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] '<>'' operator is not allowed for source level below 1.7 An error occurred at line: [31] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Incorrect number of arguments for type LinkedHashSet<E>; it cannot be parameterized with arguments <> An error occurred at line: [36] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] '<>'' operator is not allowed for source level below 1.7 An error occurred at line: [36] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Incorrect number of arguments for type LinkedHashSet<E>; it cannot be parameterized with arguments <> An error occurred at line: [43] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater An error occurred at line: [47] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater An error occurred at line: [51] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater Stacktrace:] with root cause org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: [24] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater An error occurred at line: [26] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater An error occurred at line: [28] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater An error occurred at line: [31] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] '<>'' operator is not allowed for source level below 1.7 An error occurred at line: [31] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Incorrect number of arguments for type LinkedHashSet<E>; it cannot be parameterized with arguments <> An error occurred at line: [36] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] '<>'' operator is not allowed for source level below 1.7 An error occurred at line: [36] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Incorrect number of arguments for type LinkedHashSet<E>; it cannot be parameterized with arguments <> An error occurred at line: [43] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater An error occurred at line: [47] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater An error occurred at line: [51] in the generated java file: [C:\Apache_Tomcat_9\apache-tomcat-9.0.98-windows-x64\apache-tomcat-9.0.98_Upgradation\work\Catalina\localhost\clover_portal\org\apache\jsp\export\exportCandidateList_jsp.java] Syntax error, parameterized types are only available if source level is 1.5 or greater Stacktrace: at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:72) at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:192) at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:542) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:371) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:343) at org.apache.jasper.compiler.Compiler.compile(Compiler.java:329) at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:376) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:324) at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:168) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:144) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:396) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:937) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.lang.Thread.run(Thread.java:748)
已尝试方案
修改Tomcat全局web.xml中的JspServlet配置,添加compilerSourceVM和compilerTargetVM参数并设置为1.8,但问题未解决:
<servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>compilerSourceVM</param-name> <param-value>1.8</param-value> </init-param> <init-param> <param-name>compilerTargetVM</param-name> <param-value>1.8</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet>
解决方案
1. 清理Tomcat工作目录
Tomcat会缓存JSP编译后的class文件,旧缓存可能未使用新的编译参数。找到Tomcat的work目录,删除对应应用的缓存文件夹(例如C:\Apache_Tomcat_9\...\work\Catalina\localhost\clover_portal),重启Tomcat后JSP会重新编译。
2. 检查应用本地web.xml配置
如果应用自身的WEB-INF/web.xml中也配置了<servlet-name>jsp</servlet-name>,会覆盖Tomcat全局配置。需在应用的web.xml中添加相同的compilerSourceVM和compilerTargetVM参数,或者删除应用内的JspServlet配置,让全局配置生效。
3. 确认Tomcat使用的JDK版本
Tomcat 9要求运行环境为JDK 8及以上。检查系统JAVA_HOME环境变量,或Tomcat启动脚本(startup.bat/startup.sh)中指定的JDK路径,确保指向JDK 8或更高版本。低版本JDK无法支持Java 8语法,即使设置编译参数也无效。
4. 检查JSP文件的page指令
部分JSP可能在page指令中指定了源码版本,例如:
<%@ page language="java" source="1.4" %>
这种局部设置会覆盖全局配置,需将source属性修改为1.8,或直接删除该属性。
5. 使用system.properties配置
若修改web.xml无效,可在Tomcat的conf/system.properties文件中添加以下配置:
org.apache.jasper.compiler.source=1.8 org.apache.jasper.compiler.target=1.8
保存后重启Tomcat,该配置会强制JSP编译器使用指定的Java版本。
内容的提问来源于stack exchange,提问作者Jeganth R R

