Java обнаруживает, что код был заменен

Странный вопрос - но мне интересно, как бы я написал код, чтобы сказать: "Были ли какие-либо классы перегружены intellij с тех пор, как я последний раз проверял"

Зачем?

По злым историческим причинам - запуск Springcontext занимает 2-3 минуты, что означает, что если вы просто хотите запустить один тест, это 2-3 минуты времени ожидания. Если вы человек TDD, который хочет написать немного, запустить, написать немного, запустить - это нереально. Ускорение загрузки пружинного контекста, очевидно, является идеальным, но намного больше того времени, которое у меня есть, так как все это беспорядок - я думаю просто сделать тест junit, который представляет собой бесконечный цикл:

while true
    try {run the actual test;show success} catch {show error}
    wait until code is hot swapped

таким образом, большую часть времени кто-то может просто написать немного кода, нажать клавишу сборки - и он сразу же запустится снова без перезагрузки контекста - с задержкой на 2-3 минуты до менее чем второй.

1 ответ

Взгляните на HotswapAgent, неограниченный класс времени выполнения Java и переопределение ресурсов.

Скачайте dcevm и последнюю версию hotswap-agent-core.jar и запустите ваше приложение с java --javaagent:c:\java\hotswap-agent-core.jar YourApp,

Добавьте зависимость HotswapAgent:

    <dependency>
        <groupId>org.hotswapagent</groupId>
        <artifactId>hotswap-agent-core</artifactId>
        <version>1.3.0</version>
        <scope>provided</scope>
    </dependency>

Вам также понадобятся плагины Агента Hotswap для перезагрузки Spring и других бинов / кешей:

        <dependency>
            <groupId>org.hotswapagent</groupId>
            <artifactId>hotswap-agent-plugins</artifactId>
            <version>1.3.0</version>
            <type>pom</type>
        </dependency>

Напишите свой класс плагина:

    @Plugin(name = "TriggerHotswapPlugin")
    public class TriggerHotswapPlugin {

        @OnClassLoadEvent(classNameRegexp = ".*", events = LoadEvent.REDEFINE)
        public static void onAnyReload() {
            .. synchronization mechanism with your class .. ;
        }

        @OnResourceFileEvent(path = "/", filter = ".*.resource")
        public void onResourceChanged() {
            .. synchronization mechanism with your class .. ;
        }
    }

Создать hotswap-agent.properties

    pluginPackages=your.plugin.package

В качестве альтернативы вы можете создать простой javaagent для запуска hotswap, но вам все равно нужен полный hotswap java classess, почему бы не написать собственный плагин hotswap agent.

Другие вопросы по тегам