将现有WAR部署至嵌入式Jetty 9.4.5遇JSP编译错误求助
解决嵌入式Jetty 9.4.5中JSP按Java 1.6编译的问题
嘿,这个问题我熟!嵌入式Jetty默认确实容易把JSP按低版本Java编译,导致Java 8的语法(比如菱形运算符)报错,给你几个实用的解决思路:
直接在Jetty启动代码中指定JSP编译版本
你可以在配置WebAppContext的时候,添加两个初始化参数,强制Jasper用Java 1.8编译JSP。示例代码如下:WebAppContext webAppContext = new WebAppContext(); // 配置你的WAR包路径、上下文路径等其他参数... // 设置JSP源码兼容版本和编译目标版本为1.8 webAppContext.setInitParameter("org.eclipse.jetty.jsp.source", "1.8"); webAppContext.setInitParameter("org.eclipse.jetty.jsp.target", "1.8");检查并修正WAR包内的web.xml配置
有些WAR包会在WEB-INF/web.xml里硬编码JSP的编译版本,你可以打开这个文件看看有没有类似下面的配置,如果有,把版本改成1.8:<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <!-- 把下面两行的1.6改成1.8 --> <compiler-source>1.6</compiler-source> <compiler-target>1.6</compiler-target> </jsp-property-group> </jsp-config>给JSP Servlet单独设置编译参数
如果上面的方法没生效,你可以直接找到Jetty内置的JSP Servlet,给它设置编译版本参数:ServletHolder jspServletHolder = webAppContext.getServletHandler().getServletHolder("jsp"); jspServletHolder.setInitParameter("compilerSourceVM", "1.8"); jspServletHolder.setInitParameter("compilerTargetVM", "1.8");确认Jetty依赖和JVM运行环境
确保你的项目依赖的Jetty相关组件(比如jetty-jsp、jetty-webapp)都是9.4.5的官方版本,避免依赖冲突引入了低版本的Jasper。同时检查启动Jetty的JVM环境,确保用的是Java 1.8.0_141,必要时可以在启动参数里加上:-Djava.version=1.8
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

