Возможно ли иметь среду HotReload docker на основе java? - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь использовать программу java, созданную с помощью maven, для запуска по сценарию docker -composit и горячей перезагрузки при внесении изменений. Я добавил trava-jdk libvm поверх исходного libvm и добавил библиотеку hotswapagent в нужное место. Это дает мне то, что я хочу, когда я запускаю java -version

Starting HotswapAgent '/usr/local/openjdk-11/lib/hotswap/hotswap-agent.jar'
HOTSWAP AGENT: 10:18:24.771 INFO (org.hotswap.agent.HotswapAgent) - Loading Hotswap agent {1.4.0} - unlimited runtime class redefinition.
HOTSWAP AGENT: 10:18:24.992 INFO (org.hotswap.agent.config.PluginRegistry) - Discovered plugins: [JdkPlugin, Hotswapper, WatchResources, ClassInitPlugin, AnonymousClassPatch, Hibernate, Hibernate3JPA, Hibernate3, Spring, Jersey1, Jersey2, Jetty, Tomcat, ZK, Logback, Log4j2, MyFaces, Mojarra, Omnifaces, ELResolver, WildFlyELResolver, OsgiEquinox, Owb, Proxy, WebObjects, Weld, JBossModules, ResteasyRegistry, Deltaspike, GlassFish, Vaadin, Wicket, CxfJAXRS, FreeMarker, Undertow, MyBatis]
openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment 18.9 (build 11.0.5+10)
Dynamic Code Evolution 64-Bit Server VM 18.9 (build 11.0.5+5-202001261315, mixed mode)

Мой докер-файл для достижения этой цели показан ниже

FROM maven:latest

WORKDIR /tmp
RUN wget https://github.com/TravaOpenJDK/trava-jdk-11-dcevm/releases/download/dcevm-11.0.5%2B5/java11-openjdk-dcevm-linux.tar.gz
RUN tar -xvf  java11-openjdk-dcevm-linux.tar.gz
RUN mv dcevm-11.0.5+5 /dcevm
WORKDIR /dcevm
RUN rm /usr/local/openjdk-11/lib/server/libjvm.so
RUN cp /dcevm/lib/server/libjvm.so /usr/local/openjdk-11/lib/server/
RUN cp -r /dcevm/lib/hotswap /usr/local/openjdk-11/lib/

Теперь я немного растерялся из-за того, как применить горячую перезагрузку к Ide и правильно запустить код.

На случай, если вам интересно, зачем мне такой взлом, у меня есть среда IoT, в которой есть тесты E2E, и я хотел иметь возможность быстро выполнять итерации новые тесты или неудачные тесты без необходимости перекомпиляции или перезапуска контейнеров.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

У меня нет опыта работы с этим конкретным агентом горячей замены, но в целом я отвечу на ваш вопрос:

  1. Когда вы создаете образ docker, вы должны запустить свой В конце концов, собственное приложение (через maven, с java -jar или любым другим способом). Итак, когда вы запускаете процесс приложения, вы должны подготовить приложение к удаленной отладке:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999

Вы должны предоставить порт отладки в docker, чтобы среда IDE подключалась к этому порту на хост-машине и перенаправлялась на порт 9999 в контейнере docker.

Убедитесь, что приложение работает

В IDE создать «Конфигурация удаленной отладки, в IntelliJ: Запуск / отладка конфигураций -> Удаленная -> создайте новую конфигурацию и укажите хост и незащищенный порт, которые вы создали на шаге 2. Вы должны иметь возможность подключаться и размещать точки останова в коде, который будет взаимодействовать с IDE

Если вы вносите какие-либо изменения в какой-либо исходный файл, щелкните правой кнопкой мыши и скомпилируйте его, пока вы подключены к сеансу удаленной отладки.

Если изменение можно будет выполнить, оно будет использовать hotswap на этом этапе и будет «загружать» новый байт-код в удаленный процесс прямо внутри docker в этом случае и будет применять эти изменения без перезагрузки.

По умолчанию JVM уже предоставляет Возможности Hotspot, но эта библиотека, я считаю, должна предоставить более гибкие / мощные опции.

0 голосов
/ 06 февраля 2020

Существует проект HotswapDocklands , предназначенный для запуска HotswapAgent + dcevm в Docker. Он использует отображение каталога in- Docker /extra_class_path в каталог из Docker. Затем все изменения, сделанные для любого файла внутри extra_class_path, «горячих», используя extraClassPath для dcevm. Чтобы подключить отладчик, вы должны запустить dcevm с jdwp и открыть порт отладчика с Docker.

...