Как выполнить горячую замену кода в веб-приложении Tomcat, работающем вне затмения? - PullRequest
0 голосов
/ 04 апреля 2020

Я использую функцию «Горячая замена кода», когда Tomcat запускается из Eclipse, и он отлично работает.

Но как я могу сделать это вручную, когда Tomcat работает вне Eclipse?

Через некоторое время В процессе поиска я обнаружил, что мне нужно использовать такой агент, как HotswapAgent. Но они используют этот агент с модифицированным JDK под названием DCEVM. Я не хочу использовать модифицированный JDK. Я хочу добиться того же с OpenJDK.

Я знаю, что модификация будет ограничена только телом метода, но для меня это не проблема. Как я могу добиться того же, что и Eclipse для Hot Code Replace для внешнего запуска Tomcat без использования IDE?

Редактировать: пример Eclipse просто для того, чтобы уточнить, чего я хочу достичь. Я не хочу использовать затмение вообще. Я просто хочу выполнить горячую замену кода в приложении, запущенном в Tomcat.

1 Ответ

1 голос
/ 06 апреля 2020

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

  1. Подготовьте (скомпилируйте) новую версию классов, которые вы хотите заменить. Допустим, вы хотите заменить org.pkg.MyClass, и новая версия этого класса находится в /new/path/org/pkg/MyClass.class
  2. Создайте Java Агент, который использует Instrumentation API для переопределить данный класс. Вот как может выглядеть самый простой агент:

    import java.lang.instrument.*;
    import java.nio.file.*;
    
    public class HotCodeReplace {
    
        public static void agentmain(String args, Instrumentation instr) throws Exception {
            Class oldClass = Class.forName("org.pkg.MyClass");
    
            Path newFile = Paths.get("/new/path/org/pkg/MyClass.class");
            byte[] newData = Files.readAllBytes(newFile);
    
            instr.redefineClasses(new ClassDefinition(oldClass, newData));
        }
    }
    
  3. Скомпилируйте вышеупомянутый агент и упакуйте его в .jar со следующим MANIFEST.MF

    Agent-Class: HotCodeReplace
    Can-Redefine-Classes: true
    

    Команда для создания HotCodeReplace.jar:

    jar cvfm HotCodeReplace.jar MANIFEST.MF HotCodeReplace.class
    
  4. Загрузите файл агента .jar в целевую JVM. Это можно сделать с помощью Attach API или просто с помощью утилиты jattach:

    jattach <pid> load instrument false /path/to/HotCodeReplace.jar
    

Подробнее о Java агенты »

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...