【问题标题】:How to edit a velocimacro without restarting velocity?如何在不重新启动速度的情况下编辑速度宏?
【发布时间】:2019-07-09 04:34:58
【问题描述】:

我的速度宏正在被缓存,我不希望它们……至少在开发期间不会。

我在属性文件中设置了以下属性...

velocimacro.library.autoreload=true
file.resource.loader.cache=false
velocity.engine.resource.manager.cache.enabled=false

...但这似乎没有成功

使用velocity属性,如何配置velocity不缓存宏?

(我使用的是速度 1.6.4)

编辑:

我不认为这条线...

velocity.engine.resource.manager.cache.enabled=false

...与速度有关

【问题讨论】:

    标签: java velocity


    【解决方案1】:

    我在使用 NVelocity(速度的 C# 端口)时遇到了同样的问题。挖掘它们的来源,我发现全局名称空间中宏的重新加载由以下属性控制。

    properties.SetProperty(RuntimeConstants.VM_PERM_ALLOW_INLINE_REPLACE_GLOBAL, true);
    

    我没有用速度测试这个,但看看他们的documentation,该属性存在并且似乎完全符合您的需要。

    【讨论】:

    • 我不知道为什么,但这已经成功了!这是我的属性:velocimacro.library.autoreload=true file.resource.loader.cache=false velocimacro.permissions.allow.inline.to.replace.global=true
    【解决方案2】:

    看起来你不能做你想做的事。我可以重新加载宏定义的唯一方法是将它们放在自己的库文件中并设置 velocimacro.library.autoreload = true。

    来自http://velocity.apache.org/engine/devel/developer-guide.html

    velocimacro.library = VM_global_library.vm

    多值键。将接受 CSV 作为价值。 Velocity Runtime 引擎启动时要加载的 Velocimacro 库的文件名。这些 Velocimacros 可用于所有模板。该文件被假定为相对于文件加载器资源路径的根目录。


    velocimacro.library.autoreload = false

    控制 Velocimacro 库自动加载。当设置为 true 时,将检查调用的 Velocimacro 的源 Velocimacro 库是否有更改,并在必要时重新加载。这允许您更改和测试 Velocimacro 库,而无需重新启动应用程序或 servlet 容器,就像使用常规模板一样。此模式仅在资源加载器中的缓存关闭时有效(例如 file.resource.loader.cache = false )。此功能旨在用于开发,而不是用于生产。

    【讨论】:

      【解决方案3】:

      如果宏不在速度库中而只是在某个模板文件中,我不确定这是否可行。

      但是,在这种情况下,如果您只是想让开发更容易,您可以重命名宏(通过查找/全部替换并在末尾添加一个数字或其他方式)。然后您应该能够立即看到变化。您只需要记住在完成后将其重命名为应有的名称!

      【讨论】:

        【解决方案4】:

        你可能需要设置

        file.resource.loader.modificationCheckInterval 
        

        这告诉velocity多久检查一次文件是否已更改。我无法从文档中看出默认值是什么,但我们在开发环境中将我们的设置为 2。可能只是这个属性的默认值是一个大数字或小于 0,这基本上是关闭的,这意味着它永远不会检查你的宏文件中的更改。

        【讨论】:

        • 谢谢...我对此进行了快速浏览,它似乎仅在打开缓存时适用。反正我打了一针,但没有效果
        • 你是如何初始化 Velocity 的?你确定你的属性文件正在加载吗? Velocity 的资源类路径是出了名的棘手。
        • 我可以在 Properties 对象中看到我的属性,并通过在 java 中执行 VelocityEngine velocityEngine = new VelocityEngine(properties); 将它们加载到 Velocity Engine 中。我知道这适用于我的一些属性,即file.resource.loader.path
        • velocity.log 怎么样?里面有什么吗?当我将其设置为 true 时,我会在日志中看到“Velocimacro:autoload on”。如果它确实没有被正确拾取,你应该看到“Velocimacro: autoload off”这至少会告诉你该属性是否被正确加载。如果是,则您使用的版本中可能存在一些错误。我刚刚注意到这个关于宏重新加载的 JIRA 问题。 issues.apache.org/jira/browse/VELOCITY-710 适用于版本 1.7,它是最新(非测试版)版本
        • 嗯...我的速度日志是空的。你指出的错误与我的问题不一样......事实上,如果我重命名宏,那么我会接受我的更改,但这也意味着修改对它的每次调用
        【解决方案5】:

        您可能想要使用#define 指令而不是#macro。这些参考文献可以改变。 使用它,您还可以命名一个 VTL 代码块并调用它多少次您需要它。 将宏参数定义为同一上下文中的变量,并在命名块中使用它们,就好像它是一个宏一样。 两者都可以解决常见情况;但它们并不等同。 https://velocity.apache.org/engine/1.7/user-guide.html#define

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-29
          • 1970-01-01
          • 2017-10-17
          • 1970-01-01
          • 2019-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多