#java #velocity
#java #velocity
Вопрос:
Мои макросы velocity кэшируются, и я не хочу, чтобы они были… по крайней мере, не во время разработки.
Я установил следующие свойства в своем файле свойств…
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
…имеет отношение к velocity
Ответ №1:
У меня такая же проблема с NVelocity (порт velocity на C #). Покопавшись в их соусе, я обнаружил, что повторной загрузкой макросов в глобальном пространстве имен управляет следующее свойство.
properties.SetProperty(RuntimeConstants.VM_PERM_ALLOW_INLINE_REPLACE_GLOBAL, true);
Я не тестировал это с velocity, но, просмотрев их документацию, свойство существует и, похоже, делает именно то, что вам нужно.
Комментарии:
1. Я не знаю почему, но это сделало свое дело! Вот мои свойства:
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. Имена файлов библиотеки Velocimacro, которые будут загружены при запуске механизма выполнения Velocity. Эти файлы Velocimacro доступны для всех шаблонов. Предполагается, что файл находится относительно корня пути к ресурсам загрузчика файлов.
velocimacro.library.autoreload = false
Управляет автозагрузкой библиотеки Velocimacro. Если установлено значение true, исходная библиотека Velocimacro для вызванного Velocimacro будет проверена на наличие изменений и при необходимости перезагружена. Это позволяет вам изменять и тестировать библиотеки Velocimacro без необходимости перезапуска вашего приложения или контейнера сервлетов, точно так же, как вы можете с обычными шаблонами. Этот режим работает только тогда, когда кэширование отключено в загрузчиках ресурсов (например, file.resource.loader.cache = false ). Эта функция предназначена для разработки, а не для производства.
Ответ №3:
Я не уверен, что это возможно, если макросы находятся не в библиотеке velocity, а просто в каком-нибудь файле шаблона.
Однако в этом случае, если вы просто хотите упростить разработку, вы можете просто переименовать макрос (выполнив поиск / замену всего и просто добавив число в конец или что-то в этом роде). Тогда вы сможете сразу увидеть изменения. Вам просто нужно не забыть переименовать его обратно в то, каким он должен быть, когда вы закончите!
Ответ №4:
Возможно, вам потребуется установить
file.resource.loader.modificationCheckInterval
Это указывает velocity, как часто проверять, изменился ли файл. Я не могу сказать из документов, что такое значение по умолчанию, но у нас в нашей среде разработки установлено значение 2. Возможно, значение по умолчанию для этого prop равно большому числу или меньше 0, что, по сути, отключено, то есть он никогда не будет проверять наличие изменений в вашем файле макроса.
Комментарии:
1. Спасибо… Я быстро просмотрел это, и, похоже, оно применяется только при включенном кэшировании. Я все равно попробовал, но это не возымело никакого эффекта
2. Как вы инициализируете Velocity? Вы уверены, что ваш файл свойств загружается? Velocity, как известно, сложен в отношении пути к классу ресурсов.
3. Я могу видеть свои свойства в объекте Properties и загружаю их в движок Velocity, выполнив
VelocityEngine velocityEngine = new VelocityEngine(properties);
на java. Я знаю, что это работает для некоторых моих свойств, т.еfile.resource.loader.path
4. Как насчет velocity.log? Там есть что-нибудь? Я вижу «Velocimacro: автозагрузка включена» в своих журналах, когда у меня установлено значение true. Если он действительно не распознается должным образом, вы должны увидеть «Velocimacro: автозагрузка выключена», которая, по крайней мере, сообщит вам, правильно ли загружается это свойство. Если это так, в используемой вами версии могут быть некоторые ошибки. Я только что заметил эту проблему JIRA, связанную с перезагрузкой макроса. issues.apache.org/jira/browse/VELOCITY-710 это относится к версии 1.7, которая является последней (не бета) версией
5. хм … мой журнал скорости пуст. Ошибка, на которую вы указали, не совпадает с моей проблемой… на самом деле, если я переименую макрос, то я получу свои изменения, но это также означает изменение каждого его вызова
Ответ №5:
Возможно, вы захотите использовать директиву #define вместо #macro. Эти ссылки могут меняться. С его помощью вы также можете присвоить имя блоку кода VTL и вызывать его столько раз, сколько вам нужно. Определите аргументы макроса как переменные в том же контексте и используйте их в именованном блоке, как если бы это был макрос. Оба могут решать распространенные ситуации; но они не эквивалентны. https://velocity.apache.org/engine/1.7/user-guide.html#define