Velocity模板部署至Tomcat后无法找到的问题求助
解决Velocity模板在Tomcat生产环境找不到的问题
这个问题我之前部署项目时也踩过坑!核心原因是本地开发环境和正式Tomcat的资源加载路径逻辑不一样:
- 你本地用Sysdeo插件跑Tomcat时,Eclipse会把
src/main/webapp目录加到类路径里,所以ClasspathResourceLoader能顺利找到templates下的模板; - 但正式Tomcat中,war包根目录的
templates并不在类路径范围内(Tomcat的类路径是WEB-INF/classes、WEB-INF/lib下的jar包),所以ClasspathResourceLoader自然找不到模板文件。
下面给你两个可行的解决方案,按需选择:
方案一:调整模板位置到类路径下
把src/main/webapp/templates目录移到src/main/resources下,或者通过Maven配置让模板自动复制到WEB-INF/classes(类路径目录):
在项目的pom.xml中添加资源复制配置:
<build> <resources> <resource> <directory>src/main/webapp/templates</directory> <targetPath>templates</targetPath> </resource> </resources> </build>
这样打包war时,templates会被复制到WEB-INF/classes/templates,你原来的ClasspathResourceLoader配置就能继续生效,不用改代码。
方案二:改用ServletContextResourceLoader加载web根目录资源
如果不想调整模板位置,可以改用Velocity专门为Web环境设计的ServletContextResourceLoader,它会从Web应用的根目录加载资源,完美匹配你现在的war包结构:
- 首先确保你的项目依赖了Velocity Tools(如果还没加的话);
- 修改Velocity的初始化配置,结合Jersey的
ServletContext注入:
@Context ServletContext servletContext; // 初始化VelocityEngine VelocityEngine velocityEngine = new VelocityEngine(); Properties props = new Properties(); // 指定使用webapp资源加载器 props.setProperty("resource.loader", "webapp"); props.setProperty("webapp.resource.loader.class", "org.apache.velocity.tools.view.servlet.ServletContextResourceLoader"); // 设置模板所在的相对路径(相对于Web应用根目录) props.setProperty("webapp.resource.loader.path", "/templates"); velocityEngine.init(props); // 把ServletContext传递给Velocity,让它能定位Web根目录 velocityEngine.setApplicationAttribute(ServletContextResourceLoader.SERVLET_CONTEXT_KEY, servletContext);
之后调用模板时,直接用FreigabeNeu.vm作为资源名即可,加载器会自动从/templates目录下查找。
内容的提问来源于stack exchange,提问作者JF Meier
相关产品推荐
相关产品推荐

