【问题标题】:Velocity Template auto-reload doesn't work速度模板自动重新加载不起作用
【发布时间】:2012-09-05 23:04:25
【问题描述】:

我想重新加载速度模板,因为它已更改。为此,我设置了以下内容,但是当我手动更改 META-INF/template/ 中的 .vm 文件时,重新加载不起作用。

velocimacro.library.autoreload = true
[spring|file|class].resource.loader.cache = false

有什么想法吗?这是我的velocityEngine bean

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
    <property name="resourceLoaderPath" value="classpath:META-INF/template/" />
    <property name="preferFileSystemAccess" value="false" />
    <property name="velocityProperties">
        <props>
            <prop key="spring.resource.loader.cache">false</prop>
            <prop key="file.resource.loader.cache">false</prop>
            <prop key="class.resource.loader.cache">false</prop>
            <prop key="velocimacro.library.autoreload">true</prop>

            <prop key="resource.loader">spring</prop>
            <prop key="directive.foreach.counter.name">counter</prop>
            <prop key="directive.foreach.counter.initial.value">0</prop>
            <prop key="spring.resource.loader.class">
                org.springframework.ui.velocity.SpringResourceLoader
            </prop>
        </props>
    </property>
</bean>

【问题讨论】:

    标签: java spring macros velocity


    【解决方案1】:

    正如setResourceLoaderPath doc 所说:

    请注意,在任何情况下都将启用资源缓存。使用文件资源加载器,将在访问时检查最后修改的时间戳以检测更改。 使用 SpringResourceLoader,资源将被永久缓存(例如类路径资源)。

    ...

    要强制使用 SpringResourceLoader,即在任何情况下都不将路径解析为文件系统资源,请关闭“preferFileSystemAccess”标志。有关详细信息,请参阅后者的 javadoc。

    那么对于setPreferFileSystemAccess

    设置是否优先使用文件系统访问来加载模板。 文件系统访问可以对模板更改进行热检测。

    如果启用,VelocityEngineFactory 将尝试将指定的“resourceLoaderPath”解析为文件系统资源(这也适用于扩展类路径资源和 ServletContext 资源)。

    默认为“真”。 关闭此选项以始终通过 SpringResourceLoader 加载(即作为流,不热检测模板更改),如果您的一些模板位于扩展的类目录中而其他模板位于 jar 文件中,则可能需要这样做。

    所以看起来有一些因素导致了这个问题。使用SpringResourceLoaderclasspath: 伪协议使Spring 无限缓存模板。除此之外,preferFileSystemAccess 被禁用,这确保模板永远不会通过文件系统访问。

    【讨论】:

    • 是的,SpringResourceLoader 似乎总是缓存。我只能通过使用另一个资源加载器(例如 org.apache.velocity.runtime.resource.loader.FileResourceLoader)来关闭缓存。谢谢。
    【解决方案2】:

    添加此属性为我解决了这个问题:

    velocimacro.permissions.allow.inline.to.replace.global=true
    

    我在使用下面的属性时遇到了同样的问题,但是添加上面的属性使我能够自动重新加载:

    velocimacro.library.autoreload=true
    file.resource.loader.cache=false
    

    请看How to edit a velocimacro without restarting velocity?

    【讨论】:

      【解决方案3】:

      好的,我的velocityEngine bean 设置如下:

      <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
              <property name="resourceLoaderPath" value="/templates/"/>
              <property name="velocityProperties">
                  <props>
                      <prop key="input.encoding">utf-8</prop>
                   </props>
              </property>
      </bean>
      <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
              <property name="cache" value="false"/>
              <property name="prefix" value=""/>
              <property name="suffix" value=".xhtml"/>
              <property name="contentType" value="text/html; charset=UTF-8" />
              <property name="exposeSpringMacroHelpers" value="true"/>
      </bean>
      

      (顺便说一下,假设您使用 Spring 框架) 而且我对缓存没有任何问题。但我使用配置器 bean 而不是 beanfactory。试试看这个。

      还有一个问题,这很简单,但仍然......,你真的在​​修改模板后重新部署你的项目吗?

      【讨论】:

      • 我不使用速度作为视图生成器。这只是用作某些文本内容生成的模板引擎。是的,正如我检查的那样,该文件会自动重新部署到 tomcat 并且应该对应用程序服务器可见。
      【解决方案4】:

      我过去也遇到过同样的问题,所以我写了这篇博文:Spring-mvc + Velocity + DCEVM

      主要想法是至少在开发时使用它:

      webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader
      webapp.resource.loader.path = /WEB-INF/views/
      webapp.resource.loader.cache = true
      webapp.resource.loader.modificationCheckInterval = 2
      

      我发现它比 SpringResourceLoader 工作得更好,因为现在在我的模板中我可以包含如下内容:

      #parse("/parts/header.vm")
      

      header的路径在/WEB-INF/views/header.vm中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2013-09-23
        • 1970-01-01
        • 1970-01-01
        • 2022-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多