Как Grails или Play обнаруживают изменения и классы горячей перезагрузки? - PullRequest
20 голосов
/ 08 марта 2011

Мне интересно, кто-нибудь знает подробности о том, как фреймворки, такие как Grails или Play, обнаруживают изменения в коде и автоматически запускают перекомпиляцию без перезагрузки сервера приложений? Есть ли что-то специфическое для компилятора Groovy или его динамическая природа, которая позволяет этому легко происходить?

Для фона у меня есть этап генерации кода во время процесса сборки, который я бы хотел иметь схожие возможности редактирования и обновления.

Заранее спасибо за любые указатели, даже если мне придется просеять код, чтобы получить более полную картину.

Редактировать: Я должен уточнить, что я не столько собираюсь создавать плагин Grails, сколько понять, что требуется для этого в любом приложении в контейнере сервлета. я использую Groovy, но не Grails.

Edit2: Звучит так, как будто в Play есть особый режим DEV, который включает горячую перезагрузку: http://www.playframework.org/documentation/1.1.1/main#lifecycle

Я понимаю, что JRebel выполняет сложные версии версий классов с помощью загрузчиков классов, но я предполагаю, что веб-фреймворки, такие как Grails или Play, не поднимают его до этого уровня.

1 Ответ

13 голосов
/ 09 марта 2011

Play выполняет это, используя Eclipse JDT для компиляции кода во время выполнения.

Посмотрите на следующий класс, который используется Play для выполнения необходимой компиляции во время выполнения.

https://github.com/playframework/play/blob/master/framework/src/play/classloading/ApplicationCompiler.java

Также просто отметим разницу между режимом DEV и режимом PROD в режиме воспроизведения.Это дизайнерское решение, принятое разработчиками Play, заключающееся в том, что после перевода приложения в производственный режим классы компилируются при запуске сервера и не проверяются на горячую перезагрузку.Это имеет смысл, потому что в режиме PROD ваш код на самом деле не должен меняться.

В режиме DEV файлы Java проверяются на наличие обновлений каждый раз, когда поступает новый запрос, и любые измененные файлы автоматически перекомпилируются (и ошибкиотображается прямо в браузерах).Этот процесс очень продуктивен в режиме DEV, потому что вы будете часто менять код, и немедленная обратная связь очень мощная.

...