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

把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]

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

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

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

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

你打包时候应该把ftl的模板文件放在jar包外面,而不是一起打包进去。

每次都这样吗,还是只是有时,如果每次的话怀疑是tomcat的reload方式的问题导致

你这么做吧,你把ftl文件单独打包成jar,命名resources.jar,有些开源项目就是把资源单独打包的,你这样试看看还会不会有这个问题