Я фанат Linux и программного обеспечения с открытым исходным кодом. В настоящее время я использую Arch Linux (да, кстати, я использую Arch) с i3 в качестве оконного менеджера. Полагаю, моя общая история с vim довольно типична. Оно пошло от «А? Какого черта?" вместо «Ах, ладно» до «Это имеет какой-то смысл». Мой вывод состоял в том, что я должен использовать его чаще. Это текущее состояние. Однажды (вчера) я нашел плагин fzf-vim где-то в Интернете. Он позволяет выполнять нечеткий поиск через fzf (инструмент нечеткого поиска для терминала) и открывает результат поиска как новый буфер в vim. Поэтому я сказал себе: «Зачем использовать электронные навороты, такие как vscode или IDE, такие как Eclipse, если вы всегда просто редактируете файлы?»

Цель

Целью моего эксперимента было создание простого сервиса каталогов, который загружает цены на различные продукты из базы данных через конечные точки REST. В качестве базы данных я хотел использовать базу данных PostgreSQL, работающую внутри контейнера Docker. Для самого микросервиса я использовал Quarkus, потому что он обеспечивает очень классный опыт разработчика, и вы можете легко запустить его в терминале. Quarkus — это Java Framework, реализующий различные стандарты Jakarta EE и Eclipse Microprofile. Задача должна быть такой: Не трогайте файлы ничем, кроме vim!

Установка

Как уже было сказано, для этого проекта я использовал Docker и Java. Так что, конечно, мне пришлось установить Docker и вещи, связанные с Java (JDK, Maven, …). Для vim я установил vim-plug для управления другими плагинами, а затем fzf для vim. Кроме того, я настроил его так, чтобы меню Файлы открывалось по Ctrl+P (как в vscode):

call plug#begin('~/.vim/plugged')
plug 'junegunn/fzf.vim'
call plug#end()

nnoremap ‹silent› ‹C-p› :Файлы‹CR›

Для самого проекта я использовал страницу Quarkus Quickstart, которая инициализирует для вас базовую структуру проекта и предоставляет ZIP-папку с проектом. Может быть, это был обман, но мне все равно.

Запускать

Мастер проекта Quarkus уже сгенерировал несколько классов, но, конечно, я не хотел называть свои классы сущностей «MyEntity» или класс интерфейса REST «GreetingResource», поэтому пришло время отказаться от них. Это уже оказалось мучительно после того, как навигация по разным директориям оказалась не такой уж и простой:

Итак, я подумал, что, возможно, есть способ перемещаться по папкам, как по файлам. Его нет (по крайней мере, я не нашел). Так что реструктуризация примера проекта уже немного раздражала. И свою лепту в это внесла пакетная структура Java-проектов. К счастью, Quarkus создал только два файла классов в одном каталоге. Итак, я удалил их и создал три каталога для конечных точек, классов контроллеров и модели данных. Наконец-то радость разработки действительно может начаться!

Модель данных

Я создал первый класс сущности, который должен представлять категорию в системе магазина:

В этот момент я понял, что не знаю, куда импортировать используемые классы. Хм. Да. Кто мог это предвидеть? Я погуглил vim java и нашел страницу об использовании vim в качестве полноценной IDE для Java (https://spacevim.org/use-vim-as-a-java-ide/). Но, честно говоря, это казалось чрезмерным, даже если скриншоты выглядели довольно круто. Цель состояла не в том, чтобы выяснить, может ли Spacevim заменить традиционную Java IDE, такую ​​как Eclipse, а в том, чтобы выяснить, достаточно ли vim с плагином для открытия файлов для разработки микросервисов. Сомнительно, действительно ли Java была хорошим решением. А пока я в этом сомневаюсь (гребаные пакеты!). Но ладно, я мог бы просто погуглить несколько классов, которые мне нужно импортировать.

Итак, я создал все классы сущностей. Таким образом, функция разделения окна и копипаста были благословением. Я был уверен, что будет весело, как только все классы будут созданы, и я смогу использовать функцию быстрого открытия, которая является частью плагина fzf.

В этот момент я понял, что должен включить Lombok в качестве зависимости от maven. Итак, я искал его в центральном репозитории Maven и добавил. Это не было бы проще в Eclipse. Я не доверяю редактору Eclipse Maven.

Конечные точки

Да, после создания сущностей для базы данных я продолжаю работать с конечными точками. Для некоторых следующим логическим шагом будет написание классов контроллеров, которые извлекают объекты из базы данных или даже начинают с конечных точек для определения интерфейсов. Но нет. Сначала продукты на складе, затем витрина и, наконец, погрузчик. Когда я думаю об этом, эта аналогия не имеет особого смысла, но если быть реалистом: в конце концов, вы заботитесь о логистических проблемах.

Итак, я создал новый файл класса, и это был момент, когда я понял, что не должен был выбрасывать классы-примеры. Потому что мне пришлось сначала погуглить пример Quarkus, чтобы узнать, какие пакеты мне нужны.

При написании конечных точек я понял, что было бы неплохо потратить еще немного времени на размышления о конечной точке. Требовался некоторый рефакторинг, но я решил сделать это после написания классов контроллера. Да, я должен был начать либо с архитектуры конечной точки REST, либо с классов, которые загружают данные из базы данных.

Контроллер базы данных

Эта часть была также менее захватывающей, чем раздражающей. Я понял, что знаю Java Persistence API гораздо меньше, чем думал. Таким образом, это было в основном много гугления и копирования. И я был близок к тому, чтобы сдаться, когда понял, что в основном закончил.

Первый запуск

Я написал весь необходимый код, который только мог придумать. Итак, настало время проверить, удалась ли вся работа. Пришло время действительно выяснить, какой я разработчик. Пришло время выяснить, знаю ли я, что делаю, или просто пишу чушь.

Я ввел волшебные слова в свой терминал, который запустит процесс компиляции и запустит фреймворк. В этот момент компилятор безжалостно проверял каждую написанную мной строку. Это было время, время... Я потерял нить. Вот результат.

./mvnw кваркус:dev

Удивительно, всего несколько ошибок… Очень простые синтаксические ошибки, но их всего несколько. Хм. Я действительно ожидал большего. Но ладно, это только ошибки компиляции. Вероятно, будет много ошибок во время выполнения.

Что ж… их исправление приводит к тому, что становится видно больше ошибок:

После исправления ошибок компиляции сервер наконец запустился. Я был очень взволнован и хотел проверить конечные точки. Теперь, после этих нескольких ошибок компиляции, моя тяжелая работа должна была окупиться. Теперь я собирался посмотреть, была ли вся эта операция хотя бы хорошей попыткой. Но затем он бросил IllegalArgumentExceptions и разбился.

Казалось, что параметры пути должны быть строками, а не UUID. Мне в голову пришел вопрос, имеет ли смысл преобразовывать их в каждой конечной точке или создавать ParamConverter… Я не хотел создавать ParamConverter, потому что тогда мне пришлось бы снова гуглить столько Javadocs, даже если бы это было более чистый/более общий подход. Но поиск всего этого синтаксиса и повторный импорт - это так много работы без автокомпьютерной ошибки, что я получил еще одну: letion. Значит, я этого не делал. После исправления ошибок по отдельности в каждом классе появились следующие логи:

По какой-то причине транзакционные компоненты не могут быть инициализированы. Не прочитав все сообщение об ошибке, я предположил, что это произошло из-за отсутствующих свойств сохраняемости и отсутствующей базы данных. Поэтому я создал файл docker-compose с базой данных postgres и добавил необходимые свойства приложения:

Да, ну… Это не сработало.

Через некоторое время я понял, что проблема заключалась в отсутствующей аннотации @ApplicationScoped в классах обслуживания. Добавить их было довольно просто. Функция макроса vim позволяет легко записывать ввод оператора импорта с последующей аннотацией класса. Было круто просто нажать две кнопки для выполнения тех же шагов в других файлах. На следующем шаге мне пришлось исправить мои запросы JPQL:

И тогда он просто работал…

Так что, наконец, я мог проверить это. Я добавил некоторые данные через клиент postgres sql и вызвал конечную точку. И в результате было так:

Да, не совсем то, что я хотел. Мне пришлось добавить зависимость Resteasy Jsonb Quarkus. Результатом был как минимум список json:

Я прочитал данные в базе данных, изменил настройки на обновление, а не на удаление и создание, и перезапустил сервер. Опять тот же результат:

И после некоторых повторных попыток я понял, что забыл добавить расширение jsonb (нет, идея, как это произошло). Потом получилось:

Окончательно! После всех лет. Все конечные точки работают. Лучшее чувство в мире!

Заключение

Сделал бы я это снова? Нет. Это была хорошая идея? Нет. Было весело? Нет. Было ли это хорошим занятием для дождливого субботнего дня? Наверное, но есть и лучше. Я чему-то научился? Да. vim не является IDE, а IDE упрощает разработку программного обеспечения. Какой неожиданный результат!

Подход с использованием только vim мог бы работать лучше для языков, которые — и я пытаюсь сказать это как можно более дипломатично — менее строги в своем синтаксисе и структуре папок (да, я говорю о Javascript и Python). Тем не менее, я научился ценить некоторые интересные функции vim. Особенно мне не хватает записи макросов в Eclipse. В будущем я собираюсь проверить расширения IDE, такие как vrapper, чтобы интегрировать хороший опыт, который я получил с помощью vim в Eclipse.