项目打包后在undertow运行ParseException异常

现象:

服务器部署某项目,启动时遇到问题,com.jfinal.template.stat.ParseException: Directive not found: #mytag

Eclipse中工程运行正常,后将项目放到tomcat中也可以正常运行;

分析:

报错很明显,页面中的自定义标签未定义,

代码中通过ClassScaner.scanSubClass去获取所有标签定义子类;

即public abstract class BaseDirective extends Directive {};

既然Eclipse和Tomcat中war包可以正常运行,undertow中打包后运行异常,问题必然在“自定义标签”代码中;

经过添加日志跟踪,发现我反射类代码有缺陷,去找了classes下面的类,所以更改代码:

更改这一行代码:

 ClassUtil.scanPackageBySuper
		Set<Class<?>> directiveList = ClassUtil.scanPackageBySuper("com.xx.xx.directive", BaseDirective.class);
				if (CollectionUtils.isNotEmpty(directiveList)) {
			for (Class<?> clazz : directiveList) {
				TplDirective tplDirective = clazz.getAnnotation(TplDirective.class);
				if (null != tplDirective && StrKit.notBlank(tplDirective.name())) {
					RenderManager.me().getEngine().addDirective(tplDirective.name(),
							(Class<? extends Directive>) clazz);
				}
			}
		}

Scan代码使用了hutool的工具类处理:cn.hutool.core.util.ClassUtil

结果很好,改一句代码解决问题。与Jfinal框架及打包无关。

关键词:undertow运行异常,Directive not found,com.jfinal.template.stat.ParseException

评论区

JFinal

2020-07-07 20:46

扫描容易出各种问题,所以我从来不用扫描

谢谢你的分享

SuperEric

2020-07-07 21:05

@JFinal 项目一直在线用tomcat跑着,现在新加项目,感觉jfinal全家桶挺好的,编码打包运行一条龙,所以把这问题解决了下,现在可以做到统一用undertow了。

JFinal

2020-07-07 21:55

@SuperEric jfinal 全家桶才最爽,使用 jfinal undertow 快两年了,再也离不开了