berg369 2009-08-24 18:21 采纳率: 85.7%
浏览 413
已采纳

把freemarker模板放在jar中,经常报java.io.FileNotFoundException错误,有何办法吗?

我把freemarker模板放在jar中,每次修改后,用ant把所有源文件都打到jar也包括ftl文件,如果仅修改ftl文件,则不需要在tomcat中reload该应用(尽管jar文件被更新了但jar没有重新装载吧,刷新页面会发现freemarker模板的改动生效,似乎从jar包中取模板仅是使用路径),而改过类文件后需要reload重新装载jar,但是reload之后,却又找不到其中的ftl文件了,报错如下:
java.io.FileNotFoundException: JAR entry com/originsys/manager/systemservice/view/cachelist.ftl not found in D:\apache-tomcat\webapps\eap2\WEB-INF\lib\eap-manager.jar
at 。。。。。。
但是ftl文件的确在那个jar中,只好重启tomcat才能找到,重启tomcat比reload应用慢多了,这样弄效率太低了,请问高手:reload应用后找不到jar中的ftl文件是什么原因?如何才能够找到呢?
[b]问题补充:[/b]
playfish:打包到jar中也是freemarker推荐的一种做法,因为这样可以保证模板与应用一起发布,提供了ClassTemplateLoader来加载基于类路径的模板。freemarker更推荐多加载器,当文件系统中找不到时则加载类路径中的。我就是这么设置的,但我不想同时修改两份,所有只保留jar中的。
lovewhzlq :我还没找到规律,大部分情况是会出错,如果改类重新发布并reload似乎不出错。freemarker文档中指出,freemarker模板是缓存的,当模板被改变时则刷新缓存,但打到jar中的模板被修改时不能实时获得修改的通知--也许与这有关,但我不知如何调整能避免这个问题
[b]问题补充:[/b]
[b]找到规律了:[/b]
tomcat重启后为正常状态,此时reload或者从eclipse通过ant发布(打包jar到lib下)均正常,但如果修改后再打包发布,与reload无关,则会报找不到ftl文件。
[b]也就是说,当jar文件被真正修改(增加或修改了类或ftl,使jar文件大小发生了变化,简单修改如删除一句注释则没有影响),则会找不到ftl文件,即使reload也不起作用,只能重启。[/b]

  • 写回答

4条回答 默认 最新

  • iteye_7589 2009-08-25 13:19
    关注

    首先分析需求,是否应用需要经常修改ftl。

    如果是,建议不要打入jar,放到WEB-INF/classes里好了。

    如果不是, ant build做两套 :
    一套开发的,ftl文件放外面
    一套最终发布的,ftl打入jar。

    因为freemarker有缓存,放入jar的不能监视文件是否被修改,所以
    没办法更新。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误