问题与分析

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

    [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. SQL查看数据库中每张表的数据量和总数据量

    查看所有表对应的数据量 SELECT a.name AS 表名, MAX(b.rows) AS 记录条数 FROM sys.sysobjects AS a INNER JOIN sys.sysinde ...

  2. 关闭ShowDialog的模态窗口

    [DllImport("user32.dll")] private static extern IntPtr FindWindow(string a, string b); [Dl ...

  3. Java Web-JQuery学习

    Java Web-JQuery学习 JQuery概念 是一个JS框架,可以用来简化JS的开发,设计宗旨是"write less,do more",即写更少的代码,做更多的事情.它封 ...

  4. SQLSEVER 同台服务器下不同表 触发器实现数据实时同步

    触发器的使用: 1.首先建立两个相同结构的表,两个表明的列的名称不同. student_01   字段  name  ;  字段 age  ; 字段  class ; student_02   字段  ...

  5. SecureCRT和SecureFX的安装和破解

    1.SecureCRT & SecureFX 介绍 1.1 SecureCRT SecureCRT 是一款终端仿真软件,和 Putty 的功能类似. 不过相比Putty比较简单的功能,Secu ...

  6. Android笔记(十三) Android中的基本组件——文本

    Android中常用的文本组件有 普通文本框(TextView)和编辑框(EditText)两种 EditText是TextView的子类,作用就是在界面上显示文本,区别是EditText允许用户编辑 ...

  7. DNS服务——域名解析委派

    域名解析委派 域名解析委派和DNS域名解析递归查询很像,举个例子解释域名解析委派 ①假设在.net域名下有台计算机想要访问www.cac.com. ②.net这台DNS服务器不知道www.cac.co ...

  8. Mysql安装与问题合集

    下载mysql https://dev.mysql.com/downloads/mysql/ 下载历史版本 看这篇文章 https://www.cnblogs.com/reyinever/p/8551 ...

  9. Spring Boot 2发送邮件手把手图文教程

    原文:http://www.itmuch.com/spring-boot/send-email/ 本文基于:Spring Boot 2.1.3,理论支持Spring Boot 2.x所有版本. 最近有 ...

  10. Loadrunner 计算保留两位小数不四舍五入

    有时候在测试过程中会截取返回值,当你截取的值不是最终的值,需要进行计算后才能使用并且需要保留两位小数,不进行四舍五入的计算: 此时 我使用了各种办法,但是最终我采用了一种最直接,最暴力的方法就是先乘后 ...