Jetty - Unable to compile class for JSP
问题与分析
在启动公司项目时发现报错如下:
    [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的更多相关文章
- JSP连接数据库,报Unable to compile class for JSP
		
先看一下报错原因: HTTP Status 500 - Unable to compile class for JSP: type Exception report message Unable to ...
 - org.apache.jasper.JasperException: Unable to compile class for JSP
		
项目启动时报错 : The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory S ...
 - 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 ...
 - 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 ...
 - 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 ...
 - Unable to compile class for JSP
		
https://www.cnblogs.com/mthoutai/p/7136304.html 错误提示: The return type is incompatible with JspSource ...
 - tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案【原创】
		
问题描述: tomcat启动后,console正常,console中语句为: 信息: Server startup in 7291 ms 但浏览器访问首页面http://localhost:808 ...
 - JAVA Drp项目实战——  Unable to compile class for JSP 一波三折
		
交代下背景.电脑系统是64位的,用的是64位的Tomcat.安装是32位的Myeclipse10,java环境也是32位的.Tomcat在開始启动时会报这样一个错误,"Can't load ...
 - JSP Unable to compile class for JSP
		
今天刚弄好MyEclipse环境,试了一下jsp的创建,然后就出现了一个很令人纠结的问题. 文档目录如下: Jsp代码如下: <%@page import="com.pd.Person ...
 
随机推荐
- 在论坛中出现的比较难的sql问题:27(字符串拆分、字符串合并、非连续数字的间隔范围、随机返回字符串)
			
原文:在论坛中出现的比较难的sql问题:27(字符串拆分.字符串合并.非连续数字的间隔范围.随机返回字符串) 在论坛中看到一个帖子,帖子中有一些sql方面的面试题,我觉得这些面试题很有代表性. 原帖的 ...
 - 解决Vs控制台程序出现NuGet\profile.ps1,因为在此系统上禁止运行脚本错误时或提示:“无法加载文件 \.nuget\packages\Microsoft.EntityFrameworkCore.Tools\1.1.0-preview4-final\tools\init.ps1,因为在此系统上禁止运行脚本”
			
1,打开Windows PowerShell 2.输入 set-executionpolicy remotesigned 即可执行脚本 如果执行命令失败的话重新选择Windows PowerShell ...
 - win10下,cmd,power shell设置默认编码为‘UTF-8
			
power shell 注:以下内容在非Windows平台上写的,可能会有拼写错误,如果有,请指正,我会尽快修正.可以用Powershell的配置文件(\(PROFILE)来实现.\)PROFILE默 ...
 - webpack资源加载常用配置
			
const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'bundl ...
 - 解决在web.xml中配置server服务器启动失败问题
			
一.问题"Server Tomacat v8.5 Server at locallhost failed to start" 二.解决方法:删除注释@webServlet 三.分析 ...
 - SVM-支持向量机总结
			
一.SVM简介 (一)Support Vector Machine 支持向量机(SVM:Support Vector Machine)是机器学习中常见的一种分类算法. 线性分类器,也可以叫做感知机,其 ...
 - 使用pandoc制作幻灯片
			
示例Md % Habits % John Doe % March 22, 2005 # In the morning ## Getting up - Turn off alarm - Get out ...
 - 0013SpringBoot处理国际化问题
			
1.application.properties中指明国际化文件所在路径和文件前缀 2.登录页面用#{}的形式从国际化配置文件中取值 3.编写国际化文件 ----------------------- ...
 - 优雅的处理vue注册全局组件
			
使用情景: 有频繁使用的组件 需要进行全局注册 可以将这些组件都放在components下同一个文件夹下,在此文件夹中建立 一个js文件 代码如下: import Vue from 'vue'; // ...
 - C++重温历史
			
这是一篇C#开发重新学习C++的体验文章. 作为一个C#开发为什么要重新学习C++呢?因为在C#在很多业务场景需要调用一些C++编写的COM组件,如果不了解C++,那么,很容易注定是要被C++同事忽悠 ...