Comments 7
В Java 6 появился SPI. Можно на лету поменять, например, используемый фасад логирования.
Давно хочу запушить в Play правку, позволяющую режим разработки запускать без hot reload'а, так как он подкидывает огромное количество странных и неожиданных глюков. Помню, один из молодых разработчиков моей команды очень расстроился, убив день на отладку элементарного запроса к БД, который почему-то не выбирал нужные данные. Оказалось, что для работы с перечислениями ORM под капотом использует Apache OGNL, который никак не ожидает, что перечисление может быть не равно само себе. А оно может, если загружено разными class loader'ами.
Насчет разных класслоадеров да, ну, это классика с релоадом такого типа, причем уверен, что это всё воспроизвелось бы не только в плее, но и во всех остальных фреймворках. Ну, может только бы не воспроизвелось там, где сервисы находятся в персистент-класслоадере, но это тоже далеко не везде. Плей, к слову, по идее должен всё релоадить, т.е. дропать весь юзер-код. Если этого не происходит, то скорее всего что-то с предыдущего релоада корректно не дропнулось и просто повисло в памяти (ну, по крайней мере, это самая частая причина). Именно поэтому ещё он часто на N-нном релоаде просто падает с OOM, потому что предыдущие generations как бы не дропаются, а просто создаются новые. Как я замечал, обычно все просто забивают на это и живут как есть, даже не понимая, почему релоад нестабильный. Ну, к слову, это и неудивительно, потому что откуда бы вообще об этом кто-то знал )
А запустить Плэй без релоада: там же есть, насколько я вкурсе, классы DevServerStart и ProdServerStart. Вот DevServerStart он даже без static void main и его стартует по своему именно плеевский плагин, там самому его особо никак не отранить нормально. Но вот если ProdServerStart просто задать как мэйн класс и стартовать как и любое другое приложение через sbt run, java Main и т.д, то по идее же будет всё норм? Или там всё-таки нужно им какие-то правки пушить?
P.S. С jvm-live-reload, на всякий случай уточню, таких проблем нет 👍 Тут можно если что вдруг просто стартовать свой мэйн класс как обычно.
В OpenJDK Instrumentation API и JDI реализованы поверх JVMTI.
Для большинства практических сценариев этого оказывается достаточно: что-то по-быстрому подправить можно даже на проде, и указанные ограничения (отсутствие изменения структуры классов) - это скорее плюс, чем минус для таких случаев.
Плюс вы практически не получаете никаких неожиданных спец-эффектов (тех, что может найти среднестатистический разработчик - точно).
Что за интересный такой прод, куда дебаггером цепляются и ручками в рантайме правят код )) мне кажется, даже питонисты так стараются не делать
Live Reload на JVM