Poor man's REPL
Коли я пишу щось на Python або Ruby то активно використовую їх репли: для Python це або стандартний інтерпретатор або Jupyter, для Ruby це Rails Console.
Днями треба було потестувати деякі штуки зі спарком всередині кубернетіс кластера. Програмно створювати сесії й усе таке. spark-shell
не підійшов через деякі причини, запускати спарк драйвер на локалхості теж не підходило через те що воркери не могли б достукатися до мене назад. Сетапити Telepresence не хотілося, робити докер зі скала-реплом я обламався, бо треба було б йому підсунути весь classpath спарку, а як то швидко зробити я не знав, JShell не підходив, бо Java 8, врешті я вирішив піти старим, способом яким користуюсь вже десяток років — JVM Remote Debug + HotSwap.
Тому я:
- Зібрав Spring Boot веб апку з одним едпоїнтом,
- Зібрав докер імедж через
./gradlew distTar && docker build .
зJAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
- Задеплоїв імедж в кластер:
kubectl run spark-poc --image=spark-poc-app:latest
- Прокинув собі порт для дебагу через K9S
- Під'єднався туди з IntelliJ, трігерунв ендпоїнт
/hello
і вуаля — в мене єповноціннийджава-репл.
Я зазвичай працюю двома способами:
- Пишу код який мені потрібно, підкладаю його HotSwap-ом через Ctrl+Shift+F9, трігерю ендпоїнт і дивлюся що вийшло.
- Виконую потрібні мені команди в Evaluate Expression через Alt+F9 і відразу бачу результат.
Все це економить купу часу на налаштування енвів, ребути, релоади й так далі. Так, HotSwap має свої обмеження, але я вже тертий калач, тому вони мені не заважають.
Читач може зауважити: а міг би писати на Clojure, де все для людей і є можливість запустити Remote REPL сесію! Насправді я на секунду про це подумав, але потім вирішив що маю обмежений час та недостатній досвід Clojure, щоб завести все швидко.
Тому довелось городити отакий REPL бідняка.