问题与分析

在启动公司项目时发现报错如下:

    [jetty] 2019-10-07 10:28:28.760:WARN:org.apache.jasper.compiler.Compiler:Error compiling file: D:\lewis.liu\CBX_KME\Program\jetty-temp\main\jsp\org\apache\jsp\invalidatePrevSession_jsp.javanull
[jetty] 2019-10-07 10:28:28.763:WARN::/main/invalidatePrevSession.jsp
[jetty] org.apache.jasper.JasperException: PWC6033: Unable to compile class for JSP||PWC6199: Generated servlet error:|The import com.core.cbx.ui.zk.cul.grid.renderer.FileLinkCellRenderer cannot be resolved||
[jetty] at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:123)
[jetty] at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:296)
[jetty] at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:376)
[jetty] at org.apache.jasper.compiler.Compiler.compile(Compiler.java:437)
[jetty] at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:608)
[jetty] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:360)
[jetty] at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:486)
[jetty] at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:380)
[jetty] at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)

非常直观的错误,在启动项目时,jetty报错,无法编译invalidatePrevSession.jsp该文件,原因是FileLinkCellRenderer这个类无法被解析。接着看该jsp文件,可以发现import了不少java类,如下:

<%@page import="com.core.cbx.action.ActionDispatcher"%>
<%@page import="com.core.cbx.action.exception.ActionException"%>
<%@page import="com.core.cbx.action.actionContext.UserRegisterIp"%>
<%@page import="org.apache.commons.lang3.BooleanUtils" %>
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="com.core.cbx.ui.zk.cul.grid.renderer.FileLinkCellRenderer"%>
<%@page import="com.core.cbx.resource.service.LabelManager"%>

那么问题来了,为什么只有FileLinkCellRenderer无法被解析?其它类却可以正常导入?继续查看这个无法导入的类,发现使用了Lambda表达式,将这些Lambda表达式注释掉,重新启动项目,发现不再发生上述错误,这说明JSP页面之所以无法被编译,正是由于导入的Java类中使用了Lambda表达式!

Lambda表达式是jdk1.8的新特性,而项目使用使用的是jetty6.1.26,在查询资料后了解到,这和jetty版本有关系。低版本的jetty并不支持jdk1.8,所以在编译JSP时,如果导入了使用到jdk1.8新特性的java文件就会报错。官网上虽然给出了jetty和jdk对应的版本关系,但并不是很准确。根据本人测试,在使用9.2.20.v20161216的jetty-maven插件时就不会遇到这个问题了。

解决方法

方案一:使用更高版本的支持jdk1.8的jetty

改用至少9.2版本的jetty来启动项目,如果是maven项目,则可以使用如下版本的jetty插件:

<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.20.v20161216</version>
<configuration>
</plugin>

方案二:不使用jdk1.8的新特性,譬如Lambda表达式

根据具体报错,将JSP里导入的java文件中有关的jdk1.8的新特性去掉,可以规避低版本jetty无法编译JSP文件的问题。

参考链接

Jetty - Unable to compile class for JSP的更多相关文章

  1. JSP连接数据库,报Unable to compile class for JSP

    先看一下报错原因: HTTP Status 500 - Unable to compile class for JSP: type Exception report message Unable to ...

  2. org.apache.jasper.JasperException: Unable to compile class for JSP

    项目启动时报错 : The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory S ...

  3. jsp调用javabean出现错误HTTP Status 500 - Unable to compile class for JSP

    HTTP Status 500 - Unable to compile class for JSP:   type Exception report message Unable to compile ...

  4. Count:858org.apache.jasper.JasperException: Unable to compile class for JSP

    1.错误描述 Count:858org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurre ...

  5. Servlet.service() for servlet [jsp] in context with path [/Healthy_manager] threw exception [Unable to compile class for JSP] with root cause java.lang.IllegalArgumentException: Page directive: inval

    严重: Servlet.service() for servlet [jsp] in context with path [/Healthy_manager] threw exception [Una ...

  6. Unable to compile class for JSP

    https://www.cnblogs.com/mthoutai/p/7136304.html 错误提示: The return type is incompatible with JspSource ...

  7. tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案【原创】

    问题描述: tomcat启动后,console正常,console中语句为: 信息: Server startup in 7291 ms   但浏览器访问首页面http://localhost:808 ...

  8. JAVA Drp项目实战—— Unable to compile class for JSP 一波三折

    交代下背景.电脑系统是64位的,用的是64位的Tomcat.安装是32位的Myeclipse10,java环境也是32位的.Tomcat在開始启动时会报这样一个错误,"Can't load ...

  9. JSP Unable to compile class for JSP

    今天刚弄好MyEclipse环境,试了一下jsp的创建,然后就出现了一个很令人纠结的问题. 文档目录如下: Jsp代码如下: <%@page import="com.pd.Person ...

随机推荐

  1. 90% 的 Python 开发者不知道的描述符应用

    经过上面的讲解,我们已经知道如何定义描述符,且明白了描述符是如何工作的. 正常人所见过的描述符的用法就是上篇文章提到的那些,我想说的是那只是描述符协议最常见的应用之一,或许你还不知道,其实有很多 Py ...

  2. javascript原型原型链 学习随笔

    理解原型和原型链.需从构造函数.__proto__属性(IE11以下这个属性是undefined,请使用chrome调试).prototype属性入手. JS内置的好多函数,这些函数又被叫做构造函数. ...

  3. 开源项目hutool之zip_slip漏洞

    今天突然看到了去年写的一篇漏洞分析文章,搬到博客上 ---------------- Hutool是Github上的一个开源项目,是一个java的工具包,对文件.流.加密解密.转码.正则.线程.XML ...

  4. Linux 之 文件

    文件名称 在linux中,windows概念中的文件夹和文件是没有区别的,都是统称为文件. 1.Linux中文件的名称大小写是敏感的 2.名称最多可以为255个字符 3.除了正斜线以外,都是有效字符 ...

  5. c# 定制Equals()

  6. 剖析gcc -v输出

    分析gcc -v的详细信息的意义 首先我们需要清楚一点,我们并不能完全弄清楚gcc -v的所有信息,因为毕竟我们并不是GCC编译器集合的实现者,对于这些信息,他们才是最清楚的.由于我们不能将所有的信息 ...

  7. Nginx的平滑升级记录---适用于编译安装的Nginx

    一.查看自己的Nginx的版本号 [root@localhost sbin]# cd /usr/local/nginx/sbin/ [root@localhost sbin]# ls nginx [r ...

  8. Dymola — 多学科系统仿真平台

            Dymola 是法国Dassault Systems公司的多学科系统仿真平台,广泛应用于国内外汽车.工业.交通.能源等行业的系统总体架构设计.指标分解以及系统功能验证及优化等.Dymo ...

  9. ResNet网络的Pytorch实现

    1.文章原文地址 Deep Residual Learning for  Image Recognition 2.文章摘要 神经网络的层次越深越难训练.我们提出了一个残差学习框架来简化网络的训练,这些 ...

  10. Docker那些事儿之初识Docker

    公司内部一直在使用Docker进行服务的部署和应用的升级,从开始使用Docker一直到线上的部署以及一些基础服务的开发本人都有参与,而且自己的网站也是在Docker的基础之上进行构建的,想想也需要总结 ...