Можно ли запустить Spring-приложение на удаленном хосте с локального?

У меня есть какой-то удаленный хост, на котором я хочу запустить Spring-приложение, приложение лежит на локальном хосте, т.е. я хочу с локальной машины взять исходники и запустить на удаленной машине с возможностью дебага в локальное IDE. Как-то же в крупных компаниях делают дебаг(трассировка та же), не думаю, что у машин их сотрудников хватило вычислительной мощности. Мне интересно, как это делается?

P.S. Я предполагаю, что можно сделать два репозитория, один для прода, другой для дебага, т.е. коммитишь в дебаг репу, когда тебе нужно что-то проверить, дженкинс на удаленной машине, это видит, подсасывает изменения, запускает приложения, а я просто подключается через IDE, но выглядит немного костыльно.


Ответы (1 шт):

Автор решения: Roman Konoval

Сделать это несложно, но нужно иметь ввиду, что протокол JPDA, который используется для взаимодействия IDE и JVM, плохо оптимизирован для работы по сети (по крайней мере для java 8 и ниже) и работать сама отладка будет ну очень медленно.

В предположении, что у нас локально и на сервере у нас unix делается это так.

  1. сборка артефакта, который можем запустить
  2. копирование на удаленный сервер
  3. собственно запуск
  4. присоединение отладчика

Сборка

Проще всего, конечно, использовать gradle или мавен и собрать uberjar. В IDE всегда есть возможность запустить сборку gradle или maven.

Копирование

Тут можно использовать scp, ftp или sftp. Это будет одна команда типа такой (при условии, что сконфигурирована аутентификация с использованием ключей):

scp build/target/my-app.jar [email protected]:/home/myuser/my-app.jar

В IDE опять же есть возможность запустить команду или скрипт штатным способом. В Intellij: shell script in intellij

Запуск

Тут проще всего запустить команду через ssh, при этом создав еще и ssh-тунель:

ssh -L5005:localhost:5005 [email protected] 'java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar /home/myuser/my-app.jar'

Придется, конечно, решить несколько проблем:

  1. нужно передать конфигурацию приложению. Тут зависит от реализации самого приложения. Или сначала сконфигурировать файл или файлы на сервере или передавать в переменных окружения или в system properties при запуске java.
  2. приложение может требовать каких-то ресурсов, например, БД. Это нужно будет либо сконфигурировать заранее либо запускать не просто java, а более сложный скрипт.

Отладка

В IDE выбираем вариант запуска Remote Debug и указываем соединяться к локальному хосту. Через ssh соединение будет происходить с удаленным хостом.

→ Ссылка