HTML Diff
1 added 2 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#База знаний</a></p>
1 <p><a>#База знаний</a></p>
2 <ul><li>13 май 2021</li>
2 <ul><li>13 май 2021</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Написали код, всё протестировали, и теперь у вас есть рабочее приложение на Spring? Не дайте ему запылиться на жёстком диске!</p>
4 </ul><p>Написали код, всё протестировали, и теперь у вас есть рабочее приложение на Spring? Не дайте ему запылиться на жёстком диске!</p>
5 <p>Преподаватель Skillbox. Пишет про Java, учит Go. Помнит рассвет PHP и как "грабить корованы".</p>
5 <p>Преподаватель Skillbox. Пишет про Java, учит Go. Помнит рассвет PHP и как "грабить корованы".</p>
6 <p>Попробуем разместить приложение в облаке, подключим базу данных, и вашу работу сможет увидеть весь мир. Эта инструкция подойдёт для любого проекта, написанного на Java с использованием Spring Framework, включая Telegram-боты и различные веб-сервисы.</p>
6 <p>Попробуем разместить приложение в облаке, подключим базу данных, и вашу работу сможет увидеть весь мир. Эта инструкция подойдёт для любого проекта, написанного на Java с использованием Spring Framework, включая Telegram-боты и различные веб-сервисы.</p>
7 <p>Чтобы опубликовать приложение, вам потребуются:</p>
7 <p>Чтобы опубликовать приложение, вам потребуются:</p>
8 <ul><li>аккаунт на <a>облачной платформе Heroku</a> - просто зарегистрируйтесь;</li>
8 <ul><li>аккаунт на <a>облачной платформе Heroku</a> - просто зарегистрируйтесь;</li>
9 <li>репозиторий с вашим проектом Spring + Мaven. Это необходимо, чтобы проект находился в отдельном репозитории, в корне которого есть файл pom.xml. Подходят любые репозитории, включая приватные;</li>
9 <li>репозиторий с вашим проектом Spring + Мaven. Это необходимо, чтобы проект находился в отдельном репозитории, в корне которого есть файл pom.xml. Подходят любые репозитории, включая приватные;</li>
10 <li>банковская карта для активации Add-ons, таких как MySQL или PostgreSQL, - требуется даже для бесплатных тарифов.</li>
10 <li>банковская карта для активации Add-ons, таких как MySQL или PostgreSQL, - требуется даже для бесплатных тарифов.</li>
11 </ul><p>📌 Heroku запускает ваше приложение в лёгких изолированных контейнерах Linux, которые называются dynos. Платформа предлагает различные типы дино, оптимизированные для разных приложений.<strong>У всех бесплатных dynos есть ограничения</strong>, о которых нужно помнить:</p>
11 </ul><p>📌 Heroku запускает ваше приложение в лёгких изолированных контейнерах Linux, которые называются dynos. Платформа предлагает различные типы дино, оптимизированные для разных приложений.<strong>У всех бесплатных dynos есть ограничения</strong>, о которых нужно помнить:</p>
12 <ul><li>Add-on ClearDB допускает не более 3 600 запросов к базе данных в час.</li>
12 <ul><li>Add-on ClearDB допускает не более 3 600 запросов к базе данных в час.</li>
13 <li>Всего 550-1000 бесплатных часов активности контейнеров в месяц. Да, это примерно 41 день работы, но время делится на все ваши приложения, созданные на аккаунте.</li>
13 <li>Всего 550-1000 бесплатных часов активности контейнеров в месяц. Да, это примерно 41 день работы, но время делится на все ваши приложения, созданные на аккаунте.</li>
14 <li>Если бесплатные часы активности исчерпаны, приложение после тридцати минут бездействия "засыпает". Когда вы снова зайдёте по адресу "спящего" приложения, потребуется одна-две минуты, чтобы оно ответило.</li>
14 <li>Если бесплатные часы активности исчерпаны, приложение после тридцати минут бездействия "засыпает". Когда вы снова зайдёте по адресу "спящего" приложения, потребуется одна-две минуты, чтобы оно ответило.</li>
15 <li>Максимум 512 МБ оперативной памяти на контейнер.</li>
15 <li>Максимум 512 МБ оперативной памяти на контейнер.</li>
16 </ul><p>Зайдите в личный кабинет и в правом верхнем меню нажмите<strong>New → Create new app</strong>.</p>
16 </ul><p>Зайдите в личный кабинет и в правом верхнем меню нажмите<strong>New → Create new app</strong>.</p>
17 <p>Введите имя вашего приложения - имя станет частью URL для доступа к нему, а затем нажмите<strong>Create app.</strong>Живущим в европейской части России рекомендую выбирать регион<strong>Европа</strong> - дата-центр с сервером приложений окажется ближе к вам, и время отклика будет меньше.</p>
17 <p>Введите имя вашего приложения - имя станет частью URL для доступа к нему, а затем нажмите<strong>Create app.</strong>Живущим в европейской части России рекомендую выбирать регион<strong>Европа</strong> - дата-центр с сервером приложений окажется ближе к вам, и время отклика будет меньше.</p>
18 - <p>Например, созданное мной приложение с именем shibkov-java-skillbox будет в дальнейшем доступно по адресу<a>https://shibkov-java-skillbox.herokuapp.com/</a>.</p>
 
19 <p>Теперь, когда у нас есть приложение, самое время настроить окружение для работы с Heroku в операционной системе - установить консольную утилиту heroku. Это универсальный метод для работы с приложениями, их запуска и чтения логов.</p>
18 <p>Теперь, когда у нас есть приложение, самое время настроить окружение для работы с Heroku в операционной системе - установить консольную утилиту heroku. Это универсальный метод для работы с приложениями, их запуска и чтения логов.</p>
20 <p>Теперь самое время авторизоваться на <a>heroku.com</a>через консольную утилиту. Наберите в терминале:</p>
19 <p>Теперь самое время авторизоваться на <a>heroku.com</a>через консольную утилиту. Наберите в терминале:</p>
21 <p>Процесс происходит через веб, поэтому нажатием любой клавиши перейдите в ваш браузер по умолчанию или, если решили отказаться, нажмите q для выхода.</p>
20 <p>Процесс происходит через веб, поэтому нажатием любой клавиши перейдите в ваш браузер по умолчанию или, если решили отказаться, нажмите q для выхода.</p>
22 <p>Когда откроется браузер, потребуется ввести логин и пароль. А если вы уже были авторизованы в <a>heroku.com</a>, то останется только подтвердить действие и нажать<strong>Log in.</strong></p>
21 <p>Когда откроется браузер, потребуется ввести логин и пароль. А если вы уже были авторизованы в <a>heroku.com</a>, то останется только подтвердить действие и нажать<strong>Log in.</strong></p>
23 <p>Затем можно просто вернуться в терминал - вы увидите, что успешно залогинились в консольном приложении.</p>
22 <p>Затем можно просто вернуться в терминал - вы увидите, что успешно залогинились в консольном приложении.</p>
24 <p>Чтобы проверить, кто сейчас авторизован в системе, используйте команду:</p>
23 <p>Чтобы проверить, кто сейчас авторизован в системе, используйте команду:</p>
25 <p>Ответом на неё будет email текущего пользователя. Если на этом этапе всё ок, можно посмотреть список приложений. Как вы помните, одно мы только что уже создали. Проверим, на месте ли оно:</p>
24 <p>Ответом на неё будет email текущего пользователя. Если на этом этапе всё ок, можно посмотреть список приложений. Как вы помните, одно мы только что уже создали. Проверим, на месте ли оно:</p>
26 <p>Да, всё в порядке, и ответ системы это подтверждает.</p>
25 <p>Да, всё в порядке, и ответ системы это подтверждает.</p>
27 <p>Если ваше приложение использует файловую базу данных или не использует БД вообще, этот шаг вы можете пропустить.</p>
26 <p>Если ваше приложение использует файловую базу данных или не использует БД вообще, этот шаг вы можете пропустить.</p>
28 <p>📌 На этом этапе потребуется ввести данные вашей банковской карты. Деньги не будут списаны, пока вы пользуетесь бесплатным тарифом и не превышаете лимиты. Этого более чем достаточно для демонстрации работы приложения и обучения, но для серьёзной работы придётся подписаться на один из платных тарифов Heroku.</p>
27 <p>📌 На этом этапе потребуется ввести данные вашей банковской карты. Деньги не будут списаны, пока вы пользуетесь бесплатным тарифом и не превышаете лимиты. Этого более чем достаточно для демонстрации работы приложения и обучения, но для серьёзной работы придётся подписаться на один из платных тарифов Heroku.</p>
29 <p>Откройте<a>список ваших приложений</a>и зайдите в панель управления приложения, которое мы недавно создали. Затем перейдите в закладку<strong>Resources</strong>и в поле ввода<strong>Add-ons</strong>наберите mysql. Если планируете работать с движком MySQL, найдите в списке<strong>ClearDB MySQL,</strong>а если с Postgres -<strong>Heroku Postgres.</strong></p>
28 <p>Откройте<a>список ваших приложений</a>и зайдите в панель управления приложения, которое мы недавно создали. Затем перейдите в закладку<strong>Resources</strong>и в поле ввода<strong>Add-ons</strong>наберите mysql. Если планируете работать с движком MySQL, найдите в списке<strong>ClearDB MySQL,</strong>а если с Postgres -<strong>Heroku Postgres.</strong></p>
30 <p>Бесплатный тариф здесь называется Ignite - Free. Выберите его. После подтверждения вас попросят ввести данные банковской карты.</p>
29 <p>Бесплатный тариф здесь называется Ignite - Free. Выберите его. После подтверждения вас попросят ввести данные банковской карты.</p>
31 - <p>Когда введёте информацию о банковской карте, снова перейдите в Add-ons и создайте базу данных ClearDB - в окне выбора тарифа нажмите<strong>Provision</strong>. После этого в вашем списке Add-ons появится эта новая БД. Теперь самое время попробовать подключиться к ней и задать структуру.</p>
30 + <p>Когда введёте информацию о банковской карте, снова перейите в Add-ons и создайте базу данных ClearDB - в окне выбора тарифа нажмите<strong>Provision</strong>. После этого в вашем списке Add-ons появится эта новая БД. Теперь самое время попробовать подключиться к ней и задать структуру.</p>
32 <p>Откройте настройки<strong>Settings</strong>вашего приложения:</p>
31 <p>Откройте настройки<strong>Settings</strong>вашего приложения:</p>
33 <p>В разделе<strong>Config Vars</strong>нажмите кнопку<strong>Reveal Config Vars</strong> - откроется список переменных конфигурации.</p>
32 <p>В разделе<strong>Config Vars</strong>нажмите кнопку<strong>Reveal Config Vars</strong> - откроется список переменных конфигурации.</p>
34 <p>Сейчас нас интересует переменная CLEARDB_DATABASE_URL, в которой содержится строка-ссылка для доступа к БД с указанием логина, пароля и других параметров подключения.</p>
33 <p>Сейчас нас интересует переменная CLEARDB_DATABASE_URL, в которой содержится строка-ссылка для доступа к БД с указанием логина, пароля и других параметров подключения.</p>
35 <p>Рассмотрим подробнее эту строку и её составляющие:</p>
34 <p>Рассмотрим подробнее эту строку и её составляющие:</p>
36 <p>mysql://b04d2ddd4273f2:63623d8c@eu-cdbr-west 02. cleardb.net/heroku_b72e9b34372c084? reconnect=true</p>
35 <p>mysql://b04d2ddd4273f2:63623d8c@eu-cdbr-west 02. cleardb.net/heroku_b72e9b34372c084? reconnect=true</p>
37 <p>Здесь в строке уже есть протокол, имя пользователя, пароль и хост, где находится наша база данных. Параметры упакованы в эту строковую переменную по схеме:</p>
36 <p>Здесь в строке уже есть протокол, имя пользователя, пароль и хост, где находится наша база данных. Параметры упакованы в эту строковую переменную по схеме:</p>
38 <p>[protocol://][user[: [password]]@]host[: port][/schema][? attribute1=value1.]</p>
37 <p>[protocol://][user[: [password]]@]host[: port][/schema][? attribute1=value1.]</p>
39 <p>Чтобы наше приложение и БД работали в кодировке UTF, необходимо после знака вопроса добавить в строку подключения (через амперсанд) следующие параметры: useUnicode=true, characterEncoding=utf-8, reconnect=true.</p>
38 <p>Чтобы наше приложение и БД работали в кодировке UTF, необходимо после знака вопроса добавить в строку подключения (через амперсанд) следующие параметры: useUnicode=true, characterEncoding=utf-8, reconnect=true.</p>
40 <p>В итоге должно получиться следующее:</p>
39 <p>В итоге должно получиться следующее:</p>
41 <p>mysql://b04d2ddd4273f2:63623d8c@eu-cdbr-west-02.cleardb.net/heroku_b72e9b34372c084? useUnicode=true&amp; characterEncoding=utf-8&amp; reconnect=true</p>
40 <p>mysql://b04d2ddd4273f2:63623d8c@eu-cdbr-west-02.cleardb.net/heroku_b72e9b34372c084? useUnicode=true&amp; characterEncoding=utf-8&amp; reconnect=true</p>
42 <p>Теперь, когда разобрались с форматом, можно открыть ваш любимый клиент для работы с MySQL и создать новое подключение, используя данные из строки CLEARDB_DATABASE_URL.</p>
41 <p>Теперь, когда разобрались с форматом, можно открыть ваш любимый клиент для работы с MySQL и создать новое подключение, используя данные из строки CLEARDB_DATABASE_URL.</p>
43 <p>📌 Неплохой выбор утилиты для работы с БЗ - community-версия<a>DBeaver</a>. Она совершенно бесплатна и есть для всех ОС.</p>
42 <p>📌 Неплохой выбор утилиты для работы с БЗ - community-версия<a>DBeaver</a>. Она совершенно бесплатна и есть для всех ОС.</p>
44 <p>На этом этапе и далее запускайте утилиту с параметром reconnect=true, как показано на скриншоте. Чтобы проверить, правильно ли настроен драйвер, просто нажмите<strong>Test Connection</strong>. Вы должны получить примерно такое сообщение в модальном окне.</p>
43 <p>На этом этапе и далее запускайте утилиту с параметром reconnect=true, как показано на скриншоте. Чтобы проверить, правильно ли настроен драйвер, просто нажмите<strong>Test Connection</strong>. Вы должны получить примерно такое сообщение в модальном окне.</p>
45 <p>В том случае, если ваше приложение не должно самостоятельно создавать структуру БД, придётся это сделать вручную. Также не забудьте перенести в БД на Heroku дамп тестовых данных. После этих операций база готова, мы можем использовать её для дальнейшей работы.</p>
44 <p>В том случае, если ваше приложение не должно самостоятельно создавать структуру БД, придётся это сделать вручную. Также не забудьте перенести в БД на Heroku дамп тестовых данных. После этих операций база готова, мы можем использовать её для дальнейшей работы.</p>
46 <p>Теперь добавим в наше Java-Spring-приложение настройки, необходимые для его отправки и запуска в контейнере Heroku.</p>
45 <p>Теперь добавим в наше Java-Spring-приложение настройки, необходимые для его отправки и запуска в контейнере Heroku.</p>
47 <p>📌 Все дальнейшие действия будут показаны на примере операционной системы Windows. На других ОС всё очень похоже, потому что мы везде используем консольную утилиту heroku cli.</p>
46 <p>📌 Все дальнейшие действия будут показаны на примере операционной системы Windows. На других ОС всё очень похоже, потому что мы везде используем консольную утилиту heroku cli.</p>
48 <p>Для примера я взял одну из дипломных работ студентов<a>курса "Профессия Java-разработчик"</a>. Ваши файлы с параметрами могут немного отличаться, но все остальные настройки будет примерно такими же.</p>
47 <p>Для примера я взял одну из дипломных работ студентов<a>курса "Профессия Java-разработчик"</a>. Ваши файлы с параметрами могут немного отличаться, но все остальные настройки будет примерно такими же.</p>
49 <p>Клонируйте ваш репозиторий и/или откройте проект в IDE - на скриншотах примера показана работа с IntelliJ IDEA Community 2020. Проект должен находиться в корне репозитория.</p>
48 <p>Клонируйте ваш репозиторий и/или откройте проект в IDE - на скриншотах примера показана работа с IntelliJ IDEA Community 2020. Проект должен находиться в корне репозитория.</p>
50 <p>Первое, что нужно сделать, - добавить в файл конфигурации<strong>application.properties</strong>наши настройки параметров базы данных и номер порта веб-сервера, по которому приложение будет доступно в браузере. Если его не указать, Heroku назначит порт при запуске проекта самостоятельно.</p>
49 <p>Первое, что нужно сделать, - добавить в файл конфигурации<strong>application.properties</strong>наши настройки параметров базы данных и номер порта веб-сервера, по которому приложение будет доступно в браузере. Если его не указать, Heroku назначит порт при запуске проекта самостоятельно.</p>
51 Пример расположения файлов проекта<p>Откройте<strong>application.properties</strong>. Сейчас там такой код:</p>
50 Пример расположения файлов проекта<p>Откройте<strong>application.properties</strong>. Сейчас там такой код:</p>
52 spring.datasource.url=jdbc:mysql://localhost:3306/blog_engine spring.datasource.username=root spring.datasource.password=password spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect<p>Добавьте параметры в формате ${Имя_Параметра:Значение_по_умолчанию} для spring.datasource.url и server.port, если их там не было:</p>
51 spring.datasource.url=jdbc:mysql://localhost:3306/blog_engine spring.datasource.username=root spring.datasource.password=password spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect<p>Добавьте параметры в формате ${Имя_Параметра:Значение_по_умолчанию} для spring.datasource.url и server.port, если их там не было:</p>
53 spring.datasource.url=jdbc:${CLEARDB_DATABASE_URL:mysql://localhost:3306/blog_engine} server.port=${PORT:8080}<p>Если коротко, такая запись означает, что, если в параметрах запуска присутствует параметр PORT, следует использовать его либо применить значение по умолчанию - 8080. Для переменной spring.datasource.url настройка параметра CLEARDB_DATABASE_URL работает таким же образом - в локальном окружении и в контейнере Heroku. Мы можем открыть наш проект локально c MySQL на порту 3306, а при деплое будут использоваться параметры, передаваемые приложению в строке запуска.</p>
52 spring.datasource.url=jdbc:${CLEARDB_DATABASE_URL:mysql://localhost:3306/blog_engine} server.port=${PORT:8080}<p>Если коротко, такая запись означает, что, если в параметрах запуска присутствует параметр PORT, следует использовать его либо применить значение по умолчанию - 8080. Для переменной spring.datasource.url настройка параметра CLEARDB_DATABASE_URL работает таким же образом - в локальном окружении и в контейнере Heroku. Мы можем открыть наш проект локально c MySQL на порту 3306, а при деплое будут использоваться параметры, передаваемые приложению в строке запуска.</p>
54 <p>Проверьте, что всё написано верно, и передайте в параметрах строку доступа к созданной нами БД. Для этого откройте параметры запуска приложения, выбрав в меню<strong>Run → Edit Configurations…</strong> Или выберите на панели инструментов:</p>
53 <p>Проверьте, что всё написано верно, и передайте в параметрах строку доступа к созданной нами БД. Для этого откройте параметры запуска приложения, выбрав в меню<strong>Run → Edit Configurations…</strong> Или выберите на панели инструментов:</p>
55 <p>Если у вас пока нет ни одной готовой конфигурации, создайте новую или просто запустите приложение. Подойдёт даже неудачный запуск - конфигурация появится в любом случае.</p>
54 <p>Если у вас пока нет ни одной готовой конфигурации, создайте новую или просто запустите приложение. Подойдёт даже неудачный запуск - конфигурация появится в любом случае.</p>
56 <p>Допишите параметры запуска приложения в поле<strong>Environment variables</strong>. Удобно зайти в список (кнопка в конце поля, отмеченная на скриншоте) и там ввести значения, если их несколько.</p>
55 <p>Допишите параметры запуска приложения в поле<strong>Environment variables</strong>. Удобно зайти в список (кнопка в конце поля, отмеченная на скриншоте) и там ввести значения, если их несколько.</p>
57 <p>Введите параметр доступа к БД:</p>
56 <p>Введите параметр доступа к БД:</p>
58 <p>📌 Не забудьте, что логин и пароль уже есть в строке соединения, поэтому отдельные строки данных, прописанные в конфигурации, не используются. Копируйте только ту строку, которую сгенерировал вам Heroku в параметрах<strong>Config Vars</strong>. Номер порта для тестового запуска менять не нужно.</p>
57 <p>📌 Не забудьте, что логин и пароль уже есть в строке соединения, поэтому отдельные строки данных, прописанные в конфигурации, не используются. Копируйте только ту строку, которую сгенерировал вам Heroku в параметрах<strong>Config Vars</strong>. Номер порта для тестового запуска менять не нужно.</p>
59 <p>Теперь попробуйте запустить приложение. Если дамп был загружен на Heroku и у него верная структура, то ваша программа будет работать локально, но использовать при этом облачную БД.</p>
58 <p>Теперь попробуйте запустить приложение. Если дамп был загружен на Heroku и у него верная структура, то ваша программа будет работать локально, но использовать при этом облачную БД.</p>
60 <p>После успешного запуска переходите к следующему этапу.</p>
59 <p>После успешного запуска переходите к следующему этапу.</p>
61 <p>Облако Heroku каждый раз собирает приложение из исходников с помощью Maven и выполняет полученный jar в своём окружении. Для запуска приложений в контейнерах Heroku используется команда mvn install.</p>
60 <p>Облако Heroku каждый раз собирает приложение из исходников с помощью Maven и выполняет полученный jar в своём окружении. Для запуска приложений в контейнерах Heroku используется команда mvn install.</p>
62 <p>Чтобы понять, что происходит в облаке, и научиться делать настройки более осознанно, попробуем отправить наше тестовое приложение в Heroku и развернуть. Для этого выполним следующие шаги:</p>
61 <p>Чтобы понять, что происходит в облаке, и научиться делать настройки более осознанно, попробуем отправить наше тестовое приложение в Heroku и развернуть. Для этого выполним следующие шаги:</p>
63 <ul><li>Откроем папку с репозиторием проекта в терминале Git Bash.</li>
62 <ul><li>Откроем папку с репозиторием проекта в терминале Git Bash.</li>
64 <li>Найдём ссылку на удалённый репозиторий heroku для вашего приложения в <strong>Settings</strong> - в разделе<strong>App Information → Heroku git URL</strong>.</li>
63 <li>Найдём ссылку на удалённый репозиторий heroku для вашего приложения в <strong>Settings</strong> - в разделе<strong>App Information → Heroku git URL</strong>.</li>
65 <li>Добавим новый удалённый репозиторий к вашему Git.</li>
64 <li>Добавим новый удалённый репозиторий к вашему Git.</li>
66 </ul>git remote add heroku https://git.heroku.com/shibkov-java-skillbox.git<p>Далее запустим команду git push heroku - в репозиторий heroku будет выполнена попытка сборки и публикации вашего приложения.</p>
65 </ul>git remote add heroku https://git.heroku.com/shibkov-java-skillbox.git<p>Далее запустим команду git push heroku - в репозиторий heroku будет выполнена попытка сборки и публикации вашего приложения.</p>
67 <p>📌 На скриншоте видно, что попытка развернуть приложение проходит с использованием JDK 1.8. Если у вас есть конструкции из JDK 11, этот параметр надо обязательно установить, а не использовать по умолчанию.</p>
66 <p>📌 На скриншоте видно, что попытка развернуть приложение проходит с использованием JDK 1.8. Если у вас есть конструкции из JDK 11, этот параметр надо обязательно установить, а не использовать по умолчанию.</p>
68 <p>Я отметил цветом, что используется Maven 3.6.2, который собирает проект командой install, пропуская при этом тесты. Но проект не соберётся, если не был настроен Maven, и мы увидим такое окончание запуска:</p>
67 <p>Я отметил цветом, что используется Maven 3.6.2, который собирает проект командой install, пропуская при этом тесты. Но проект не соберётся, если не был настроен Maven, и мы увидим такое окончание запуска:</p>
69 <p>Неудача вполне ожидаема. Зато мы получили все необходимые данные для исправления ошибок и дальнейшей работы: необходимо правильно настроить ресурсы для сборки приложения, установить версию JDK для компиляции.</p>
68 <p>Неудача вполне ожидаема. Зато мы получили все необходимые данные для исправления ошибок и дальнейшей работы: необходимо правильно настроить ресурсы для сборки приложения, установить версию JDK для компиляции.</p>
70 <p>Приступим!</p>
69 <p>Приступим!</p>
71 <p>Чтобы настроить версию JDK, создайте в корне проекта файл system.properties с таким содержимым:</p>
70 <p>Чтобы настроить версию JDK, создайте в корне проекта файл system.properties с таким содержимым:</p>
72 <p>Добавьте файл в git и выполните коммит, не забыв закоммитить ранее изменённый application.properties. После этих действий снова выполните push на Heroku.</p>
71 <p>Добавьте файл в git и выполните коммит, не забыв закоммитить ранее изменённый application.properties. После этих действий снова выполните push на Heroku.</p>
73 <p>В результате вы увидите, что контейнер Heroku подхватил эти настройки и использует JDK11.</p>
72 <p>В результате вы увидите, что контейнер Heroku подхватил эти настройки и использует JDK11.</p>
74 <p>И даже сборка будет успешной:</p>
73 <p>И даже сборка будет успешной:</p>
75 <p>Но только на первый взгляд - перейдя по ссылке деплоя, мы увидим<strong>Application Error</strong>. Это означает, что приложение завершилось с ошибкой и сборка приложения выполнена неверно. Самое время её настроить.</p>
74 <p>Но только на первый взгляд - перейдя по ссылке деплоя, мы увидим<strong>Application Error</strong>. Это означает, что приложение завершилось с ошибкой и сборка приложения выполнена неверно. Самое время её настроить.</p>
76 <p>Для настройки измените файл pom.xml. При исполнении Maven прежде всего проверяет, есть ли в нём все необходимые данные и все ли они синтаксически правильно записаны. Ниже мой пример, а ваши значения, скорее всего, будут другими.</p>
75 <p>Для настройки измените файл pom.xml. При исполнении Maven прежде всего проверяет, есть ли в нём все необходимые данные и все ли они синтаксически правильно записаны. Ниже мой пример, а ваши значения, скорее всего, будут другими.</p>
77 &lt;groupId&gt;skillbox-java-course&lt;/groupId&gt; &lt;artifactId&gt;blog-engine&lt;/artifactId&gt; &lt;version&gt;1.0&lt;/version&gt;<p>Эти настройки говорят, что при сборке будет создан файл с именем blog-engine-1.0.jar в папке target. Формула сборки имени файла такая: [artifactId]-[version].jar. Запомните её - нам это пригодится в дальнейшем.</p>
76 &lt;groupId&gt;skillbox-java-course&lt;/groupId&gt; &lt;artifactId&gt;blog-engine&lt;/artifactId&gt; &lt;version&gt;1.0&lt;/version&gt;<p>Эти настройки говорят, что при сборке будет создан файл с именем blog-engine-1.0.jar в папке target. Формула сборки имени файла такая: [artifactId]-[version].jar. Запомните её - нам это пригодится в дальнейшем.</p>
78 <p>📌 Папка target должна быть исключена из отслеживания Git.</p>
77 <p>📌 Папка target должна быть исключена из отслеживания Git.</p>
79 <p>Теперь добавьте настройки плагина сборки, поместив в блок properties файла pom.xml такие строки:</p>
78 <p>Теперь добавьте настройки плагина сборки, поместив в блок properties файла pom.xml такие строки:</p>
80 &lt;properties&gt; &lt;java.version&gt;11&lt;/java.version&gt; &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt; &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt; &lt;maven.compiler.source&gt;11&lt;/maven.compiler.source&gt; &lt;maven.compiler.target&gt;11&lt;/maven.compiler.target&gt; &lt;/properties&gt;<p>И в блок build:</p>
79 &lt;properties&gt; &lt;java.version&gt;11&lt;/java.version&gt; &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt; &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt; &lt;maven.compiler.source&gt;11&lt;/maven.compiler.source&gt; &lt;maven.compiler.target&gt;11&lt;/maven.compiler.target&gt; &lt;/properties&gt;<p>И в блок build:</p>
81 &lt;build&gt; &lt;plugins&gt; &lt;plugin&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt; &lt;executions&gt; &lt;execution&gt; &lt;goals&gt; &lt;goal&gt;build-info&lt;/goal&gt; &lt;/goals&gt; &lt;configuration&gt; &lt;additionalProperties&gt; &lt;encoding.source&gt;${project.build.sourceEncoding}&lt;/encoding.source&gt; &lt;encoding.reporting&gt;${project.reporting.outputEncoding}&lt;/encoding.reporting&gt; &lt;java.source&gt;${maven.compiler.source}&lt;/java.source&gt; &lt;java.target&gt;${maven.compiler.target}&lt;/java.target&gt; &lt;/additionalProperties&gt; &lt;/configuration&gt; &lt;/execution&gt; &lt;/executions&gt; &lt;/plugin&gt; &lt;/plugins&gt; &lt;/build&gt;<p>Затем создайте в корне проекта файл Procfile (без расширения) с таким содержанием:</p>
80 &lt;build&gt; &lt;plugins&gt; &lt;plugin&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt; &lt;executions&gt; &lt;execution&gt; &lt;goals&gt; &lt;goal&gt;build-info&lt;/goal&gt; &lt;/goals&gt; &lt;configuration&gt; &lt;additionalProperties&gt; &lt;encoding.source&gt;${project.build.sourceEncoding}&lt;/encoding.source&gt; &lt;encoding.reporting&gt;${project.reporting.outputEncoding}&lt;/encoding.reporting&gt; &lt;java.source&gt;${maven.compiler.source}&lt;/java.source&gt; &lt;java.target&gt;${maven.compiler.target}&lt;/java.target&gt; &lt;/additionalProperties&gt; &lt;/configuration&gt; &lt;/execution&gt; &lt;/executions&gt; &lt;/plugin&gt; &lt;/plugins&gt; &lt;/build&gt;<p>Затем создайте в корне проекта файл Procfile (без расширения) с таким содержанием:</p>
82 web: java -jar target/blog-engine-1.0.jar<p>Здесь мы объясняем Heroku, как запустить приложение. Поэтому поменяйте имя файла на имя вашего артефакта и версию. В итоге проект с новыми файлами будет выглядеть так:</p>
81 web: java -jar target/blog-engine-1.0.jar<p>Здесь мы объясняем Heroku, как запустить приложение. Поэтому поменяйте имя файла на имя вашего артефакта и версию. В итоге проект с новыми файлами будет выглядеть так:</p>
83 <p>Добавьте эти файлы в Git, выполните коммит изменений, а потом push<strong>.</strong>После перехода по ссылке у вас должно запуститься приложение:</p>
82 <p>Добавьте эти файлы в Git, выполните коммит изменений, а потом push<strong>.</strong>После перехода по ссылке у вас должно запуститься приложение:</p>
84 <p><strong>Поздравляю!</strong>Теперь вы можете продолжить разработку приложения, а когда это необходимо - публиковать его на Heroku.</p>
83 <p><strong>Поздравляю!</strong>Теперь вы можете продолжить разработку приложения, а когда это необходимо - публиковать его на Heroku.</p>
85 <p>Предположим, что при запуске приложения по ссылке вы видите такую картинку:</p>
84 <p>Предположим, что при запуске приложения по ссылке вы видите такую картинку:</p>
86 <p>Heroku нам подсказывает, что можно посмотреть логи запуска. Выполните команду heroku logs --tail в новом окне терминала git bash и посмотрите вывод - в нём будут следующие строки:</p>
85 <p>Heroku нам подсказывает, что можно посмотреть логи запуска. Выполните команду heroku logs --tail в новом окне терминала git bash и посмотрите вывод - в нём будут следующие строки:</p>
87 2020-04-12T20:39:13.390962+00:00 heroku[web.1]: State changed from crashed to starting 2020-04-12T20:39:12.841154+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them. 2020-04-12T20:39:12.849514+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8 2020-04-12T20:39:13.202216+00:00 app[web.1]: no main manifest attribute, in target/blog-engine-1.0.jar 2020-04-12T20:39:19.058629+00:00 heroku[web.1]: State changed from starting to crashed<p>Если вы получили такой ответ, очевидно, была попытка запуска приложения - и можно посмотреть, с какими именно параметрами. Кстати, вполне понятно, почему не запустилась: Heroku не может определить, какой класс Main запускать. Логично, ведь контейнер читает информацию из MANIFEST.INF.</p>
86 2020-04-12T20:39:13.390962+00:00 heroku[web.1]: State changed from crashed to starting 2020-04-12T20:39:12.841154+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them. 2020-04-12T20:39:12.849514+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8 2020-04-12T20:39:13.202216+00:00 app[web.1]: no main manifest attribute, in target/blog-engine-1.0.jar 2020-04-12T20:39:19.058629+00:00 heroku[web.1]: State changed from starting to crashed<p>Если вы получили такой ответ, очевидно, была попытка запуска приложения - и можно посмотреть, с какими именно параметрами. Кстати, вполне понятно, почему не запустилась: Heroku не может определить, какой класс Main запускать. Логично, ведь контейнер читает информацию из MANIFEST.INF.</p>
88 <p>Такую проверку вы можете создать сами. Для этого скомпилируйте проект, выполнив команду maven install, например, из IDEA.</p>
87 <p>Такую проверку вы можете создать сами. Для этого скомпилируйте проект, выполнив команду maven install, например, из IDEA.</p>
89 <p>Теперь можно попробовать запустить jar из корня проекта:</p>
88 <p>Теперь можно попробовать запустить jar из корня проекта:</p>
90 <p>Этот пример показывает, что проблему можно решить локально: проверить на своём компьютере в IDEA, а уже потом отправить приложение на Нeroku.</p>
89 <p>Этот пример показывает, что проблему можно решить локально: проверить на своём компьютере в IDEA, а уже потом отправить приложение на Нeroku.</p>
91 <p>Для этого нужно сделать следующее:</p>
90 <p>Для этого нужно сделать следующее:</p>
92 <ul><li>Проверьте, что все необходимые файлы конфигурации на месте и вы добавили все строки на свои места.</li>
91 <ul><li>Проверьте, что все необходимые файлы конфигурации на месте и вы добавили все строки на свои места.</li>
93 <li>Попробуйте выполнить<strong>Reimport</strong>pom.xml - файла конфигурации Maven.</li>
92 <li>Попробуйте выполнить<strong>Reimport</strong>pom.xml - файла конфигурации Maven.</li>
94 </ul><ul><li>Проверьте, что все файлы добавлены в Git и все их изменения закоммичены.</li>
93 </ul><ul><li>Проверьте, что все файлы добавлены в Git и все их изменения закоммичены.</li>
95 </ul><p>После этого добейтесь локального запуска вашего JAR-файла - главное, чтобы запустился Spring, - а затем отправляйте приложение в облако через push.</p>
94 </ul><p>После этого добейтесь локального запуска вашего JAR-файла - главное, чтобы запустился Spring, - а затем отправляйте приложение в облако через push.</p>
96 <p>Ну вот, теперь вы можете не только публиковать Spring-Boot-приложения на Heroku, но и отлаживать, читать логи запуска и решать возникающие проблемы. Желаю быстрых деплоев и стабильной работы вашему коду.</p>
95 <p>Ну вот, теперь вы можете не только публиковать Spring-Boot-приложения на Heroku, но и отлаживать, читать логи запуска и решать возникающие проблемы. Желаю быстрых деплоев и стабильной работы вашему коду.</p>
97 <a>Научитесь: Профессия Java-разработчик + ИИ Узнать больше</a>
96 <a>Научитесь: Профессия Java-разработчик + ИИ Узнать больше</a>