Poor man's REPL

Коли я пишу щось на Python або Ruby то активно використовую їх репли: для Python це або стандартний інтерпретатор або Jupyter, для Ruby це Rails Console.

Днями треба було потестувати деякі штуки зі спарком всередині кубернетіс кластера. Програмно створювати сесії й усе таке. spark-shell не підійшов через деякі причини, запускати спарк драйвер на локалхості теж не підходило через те що воркери не могли б достукатися до мене назад. Сетапити Telepresence не хотілося, робити докер зі скала-реплом я обламався, бо треба було б йому підсунути весь classpath спарку, а як то швидко зробити я не знав, JShell не підходив, бо Java 8, врешті я вирішив піти старим, способом яким користуюсь вже десяток років — JVM Remote Debug + HotSwap.

Тому я:

  1. Зібрав Spring Boot веб апку з одним едпоїнтом,
  2. Зібрав докер імедж через ./gradlew distTar && docker build . з JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
  3. Задеплоїв імедж в кластер: kubectl run spark-poc --image=spark-poc-app:latest
  4. Прокинув собі порт для дебагу через K9S
  5. Під'єднався туди з IntelliJ, трігерунв ендпоїнт /hello і вуаля — в мене є повноцінний джава-репл.

Я зазвичай працюю двома способами:

  1. Пишу код який мені потрібно, підкладаю його HotSwap-ом через Ctrl+Shift+F9, трігерю ендпоїнт і дивлюся що вийшло.
  2. Виконую потрібні мені команди в Evaluate Expression через Alt+F9 і відразу бачу результат.

Все це економить купу часу на налаштування енвів, ребути, релоади й так далі. Так, HotSwap має свої обмеження, але я вже тертий калач, тому вони мені не заважають.

Читач може зауважити:  а міг би писати на Clojure, де все для людей і є можливість запустити Remote REPL сесію! Насправді я на секунду про це подумав, але потім вирішив що маю обмежений час та недостатній досвід Clojure, щоб завести все швидко.

Тому довелось городити отакий REPL бідняка.


Сподобалось? Долучайтеся до мого телеграм каналу: https://t.me/full_of_hatred