之前按照网上的一些教程,在spring中配置了
<bean id="velocityEngine"
class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="resourceLoaderPath" value="classpath:" />
<property name="velocityProperties">
<props>
<prop key="input.encoding">UTF-8</prop>
<prop key="output.encoding">UTF-8</prop>
<prop key="default.contentType">text/html; charset=UTF-8</prop>
</props>
</property>
</bean>
将需要使用的模版放在maven定义的resources文件夹中。
最近进行了一次代码重构,将这部分内容移动到了独立的jar包中,再次运行程序,在velocity对模版文件进行merge的时候,总是提示模版文件找不到,而在打好的jar包中,是存在这个模版文件的。
对应用进行了debug之后,发现最终的velocity在用基于文件系统的resourceloader,所以无法找到在jar包中的模版文件。在spring的VelocityEngineFactory类中可以发现,spring是通过initVelocityResourceLoader这个方法来判断初始化什么resourceload给velocity引擎的。主导这个方法选择的,就是preferFileSystemAccess这个boolean类型。这个字段默认创建的时候,会被初始化为true,也就是说,spring默认会使用给予文件系统的resourceloader。解决的方法就是在配置文件中覆盖这个字段的值,增加一行:
<property name="preferFileSystemAccess" value="false" />
这样就强制spring在初始化velocityEngine的时候,采用spring resourceloader,这样就能够获取到jar包中的模版文件了。
非常赞