现象:
服务器部署某项目,启动时遇到问题,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
谢谢你的分享