【问题标题】:Let velocity find templates in war让velocity在战争中寻找模板
【发布时间】:2018-05-14 11:23:50
【问题描述】:

我正在使用存储在 src/main/webapp/templates 中的 Velocity 模板。

我基于 Jersey 的 REST 服务需要找到这些模板。在我的 Eclipse 本地(使用 Sysdeo 插件),我使用了

p.setProperty("resource.loader", "class");
p.setProperty("class.resource.loader.class",
    "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");

让 Tomcat 找到模板(我从 https://stackoverflow.com/a/38812523/927493 得到的)。现在,当我将战争部署到“真实”Tomcat 时,找不到资源(无法找到资源'templates/FreigabeNeu.vm')

我可能必须将属性设置为不同的东西,但我只是不知道我需要怎么做。

我检查了templates 目录确实被复制到了战争的主目录。

【问题讨论】:

  • src/main/webapp/templates 真的在你的类路径中吗?
  • 如何检查?
  • 如果您将一个类放入您的 WAR 文件的那个部分,您认为您的 Web 应用程序可以加载一个类吗?我试图让您思考 ClasspathResourceLoader 的实际作用。
  • 真的想知道 ClasspathResourceLoader 的实际作用,如果您能指出正确的方向,那就太好了。顺便说一句:模板不是类,而是文本文件,但我不知道这是否重要。

标签: java tomcat jersey velocity resource-loading


【解决方案1】:

ClasspathResourceLoader 将从 类路径 加载资源,而不仅仅是 WAR 文件中的某个任意位置。这意味着如果您的模板在您的 WAR 文件(或任何地方)中的 /webapp/templates 中,但该路径不在 classpath 中,那么将无法找到它们。

如果这是一个 Web 应用程序,那么您真正想要使用的是 Velocity Tools's WebappLoader,它使用 ServletContext 从上下文本身加载文件。它能够从 Web 应用程序中的几乎任何地方读取文件,甚至从 WAR 文件等中读取文件。

您可能需要仔细检查 WAR 文件的结构——templates/ 目录的确切位置——以确保基本路径正确。我的猜测是它们最终会在/templates/webapp/templates 下结束,但我怀疑前者更有可能......目录webapp 很可能最终成为WAR 文件的根目录,所以@ 987654330@ 可能是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    相关资源
    最近更新 更多