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

将现有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:20:56