How to edit a velocimacro without restarting veloc

2019-02-17 09:33发布

问题:

My velocity macros are being cached and I don't want them to be... not during development at least.

I've set the following properties in my properties file...

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

... but this doesn't seem to have done the trick

Using velocity properties, how can I configure velocity to not cache macros?

(I'm using velocity 1.6.4)

EDIT:

I don't think the line...

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

...is relevant to velocity

回答1:

I have been having the same issue with NVelocity (C# port of velocity). Digging through their souce I found that the re-loading of the macros in the global name space are controlled by the following property.

properties.SetProperty(RuntimeConstants.VM_PERM_ALLOW_INLINE_REPLACE_GLOBAL, true);

I havn't tested this with velocity but looking at their documentation the property exists and seem to do exactly what you need.



回答2:

Looks like you cant do what you want. The only way I could get macro definitions to reload is to put them in their own library file and set the velocimacro.library.autoreload = true.

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

velocimacro.library = VM_global_library.vm

Multi-valued key. Will accept CSV for value. Filename(s) of Velocimacro library to be loaded when the Velocity Runtime engine starts. These Velocimacros are accessable to all templates. The file is assumed to be relative to the root of the file loader resource path.


velocimacro.library.autoreload = false

Controls Velocimacro library autoloading. When set to true the source Velocimacro library for an invoked Velocimacro will be checked for changes, and reloaded if necessary. This allows you to change and test Velocimacro libraries without having to restart your application or servlet container, just like you can with regular templates. This mode only works when caching is off in the resource loaders (e.g. file.resource.loader.cache = false ). This feature is intended for development, not for production.



回答3:

I'm not sure this is possible if the macros are not in a velocity library and just in some template file.

However, in this case, if you just want to make development easier, you can just rename the macro (by doing a find/replace all and just adding a number to the end or something). Then you should be able to see the change straight away. You just have to remember to rename it back to what it's supposed to be when your finished!



回答4:

You might need to set

file.resource.loader.modificationCheckInterval 

This tells velocity how often to check if the file has changed. I can't tell from the docs what the default is, but we have ours set to 2 in our dev env. It might just be that the default value for this prop is a high number or less than 0 which is essentially off, meaning it will never check for changes in your macro file.



标签: java velocity