berg369
berg369
2009-08-24 18:21

把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条回答