You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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包结构:

  1. 首先确保你的项目依赖了Velocity Tools(如果还没加的话);
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:34:55