如何在不重启Velocity的情况下编辑Velocimacro?

6

我的速度宏被缓存了,但我不希望它们被缓存...至少在开发期间不希望。

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

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

...... 但是貌似这并没有解决问题。

使用Velocity属性,我该如何配置Velocity以不缓存宏?

(我正在使用Velocity 1.6.4)

编辑:

我认为那一行代码......

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

...与速度有关

5个回答

10

我一直遇到NVelocity(velocity的C#端口)相同的问题。通过查找他们的源代码,我发现全局命名空间中宏的重新加载由以下属性控制。

properties.SetProperty(RuntimeConstants.VM_PERM_ALLOW_INLINE_REPLACE_GLOBAL, true);

我尚未使用Velocity测试过这个内容,但从它们的文档来看,该属性存在并且似乎正好可以满足您的需求。


4
我不知道为什么,但这个方法很有效!以下是我的属性设置: velocimacro.library.autoreload=true file.resource.loader.cache=false velocimacro.permissions.allow.inline.to.replace.global=true - Edd

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)。此功能仅用于开发,而非生产。

1

如果宏不在 velocity 库中,而是在一些模板文件中,我不确定是否有可能实现。

然而,在这种情况下,如果您只是想让开发更加容易,可以尝试重命名该宏(通过查找/替换所有,并添加数字到末尾或其他什么方式)。然后你应该立刻能够看到更改。在完成工作时,只需记得将其重新命名为原来的名称即可!


0

你可能需要设置

file.resource.loader.modificationCheckInterval 

这告诉Velocity多久检查一次文件是否更改。从文档中无法确定默认值是什么,但我们在开发环境中将其设置为2。可能默认值对于此属性来说是一个较高的数字或小于0,这实际上是关闭的,意味着它永远不会检查您的宏文件中的更改。


谢谢...我快速查看了一下,似乎只适用于缓存打开的情况。不过我还是试了一下,但没有效果。 - Edd
你是如何初始化Velocity的?你确定你的属性文件已经被加载了吗?Velocity在其资源类路径方面非常棘手。 - Jberg
我可以在Properties对象中看到我的属性,并通过在Java中执行VelocityEngine velocityEngine = new VelocityEngine(properties);将它们加载到Velocity引擎中。我知道这对于我的某些属性有效,例如file.resource.loader.path - Edd
速度日志怎么样? 里面有什么吗? 当我将其设置为true时,我的日志中会出现“Velocimacro:autoload on”。 如果它真的没有被正确地拾取,您应该会看到“Velocimacro:autoload off” 这将至少告诉您是否正确加载了该属性。 如果是这样,您使用的版本可能存在一些错误。 我刚刚注意到关于宏重新加载的JIRA问题。 https://issues.apache.org/jira/browse/VELOCITY-710适用于最新(非beta)版本1.7 - Jberg
嗯...我的速度日志是空的。你指出的错误与我的问题不同...事实上,如果我重命名宏,那么我就可以捕捉到我的更改,但这也意味着修改每个调用它的地方。 - Edd

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接