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 бідняка.