Spring Roo vs JHipster: проект выпускника курса «Разработчик на Spring Framework»
Предлагаем вашему вниманию очередной выпускной проект, сделанный нашим выпускником Дмитрием Коганом. Дмитрий решил сравнить два инструмента для быстрого создания приложений на Java — Spring Roo и JHipster. Им была проделана огромная исследовательская работа, результат которой вы сейчас и увидите.
При выполнении своей работы Дмитрий определил для себя следующие интересы: 1. Личный: попробовать написать веб-приложение без написания фронтенда. 2. Академический: изучить rapid application development (RAD) tools – Spring Roo и Jhipster. 3. Практический: исследовать возможность быстрого создания современного приложения со всеми необходимыми примочками.
Как известно, современное приложение – это сто одёжек, с застёжками и без, а бизнес-логики в нём зачастую совсем немного. К тому же, как верно процитировал Дмитрий Козьму Пруткова: «Специалист подобен флюсу: полнота его односторонняя». Действительно, не каждый разработчик — full-stack. Именно поэтому на рынке и существуют платформы Spring Roo и JHipster.
Spring Roo
Технологии под капотом: — Spring Boot; — Proxy/CGLIB; — AspectJ.
Технологии предоставляемые: — Spring Data JPA/Hibernate; — SQL; — Thymleaf/Freemarker; — Spring MVC; — Spring Web Flow; — Spring Security (Basic Auth); — REST/SOAP; — Test: Unit/Integration; — JasperReports (exporting data to CSV, PDF and XLS).
Интеграция: 1. Eclipse / STS: 2. IDEA — добавлена в 11-й версии, убрана в 15-й версии. Код:
project setup --topLevelPackage dik.roo.collmate jpa setup --provider HIBERNATE --database H2_IN_MEMORY enum type --class ~.domain.reference.Status enum constant --name OK enum constant --name Away enum constant --name Lost enum constant --name Expected enum constant --name Undefined entity jpa --class ~.domain.Cd --sequenceName CD_SEQ entity jpa --class ~.domain.Dvd --sequenceName DVD_SEQ focus --class ~.domain.Cd field string --fieldName name --notNull field string --fieldName performer field string --fieldName releaseYear field string --fieldName diskCount field string --fieldName medium field string --fieldName label field enum --fieldName status --type ~.domain.reference.Status field date --fieldName added --type java.util.Calendar –past focus --class ~.domain.Dvd field string --fieldName name --notNull field string --fieldName releaseYear field string --fieldName diskCount field string --fieldName format field string --fieldName lang field enum --fieldName status --type ~.domain.reference.Status field date --fieldName added --type java.util.Calendar --past repository jpa --all service --all web mvc setup web mvc view setup --type THYMELEAF web mvc templates setup --type THYMELEAF web mvc controller --all --responseType JSON --pathPrefix /rest web mvc controller --all --responseType THYMELEAF web mvc finder --all --responseType THYMELEAF test unit --class ~.domain.Cd test unit --class ~.domain.Dvd test integration --class ~.repository.CdRepository test integration --class ~.repository.DvdRepository test integration --class ~.web.CdsCollectionJsonController test integration --class ~.web.CdsCollectionThymeleafController test integration --class ~.web.DvdsCollectionJsonController
Вид готового приложения:
Выводы Дмитрия: — аспект сидит на аспекте и аспектом погоняет; — править и дополнять всё это чрезвычайно непривычно и сложно; — Spring Roo 2 стал не только шагом вперёд, но и шагом назад: возможности разработки и технологии не только добавились, но и потерялись; — из фронтенда – один Timlif; — нет мониторинга; — разработкой неспешно занимается не слишком большой испанский коллектив авторов из DISID; — полноценной частью Spring стека Roo так и не стал; — примеров сопряжения с различными иными технологиями не слишком много; — вопросов и ответов по Spring Roo не накоплено в достаточном количестве; — энтузиазма на будущее не видно.
Однако: — сама разработка производится быстро с помощью скриптов, в рантайме ничего не происходит, поддерживается система плагинов; — имеется удобный и многофункциональный пользовательский интерфейс с поиском «из коробки».
Итого: — идеален для CRUD-приложений, а также CRUD-частей сложных приложений, которые могут быть выполнены в отличном от основного дизайне; — не подходит для создания прототипов из-за сложностей последующего рефакторинга.
JHipster
Технологии под капотом: — Yeoman; — Npm; — nodeJS.
Технологии предоставляемые:
Подробности использования JHipster вы можете посмотреть по ссылке на Github Дмитрия, мы же предлагаем ознакомиться со сделанными им выводами: — практически всё, что должно быть в современном веб-приложении, реализовано; — добавлены всякие плюшки вроде Jhipster Online, Browsersync, JDL Studio и т. п.; — одной командой реализуются kubernetes, heroku, docker-compose и т. д.; — используется весь современный фронтенд: React, Angular, Vue.
Однако: — JHipster создаёт невероятное количество разнообразного кода (вместе с подкаталогом node_modules – почти гигабайт и под сотню тысяч файлов); — как минимум требуется дополнительно инсталлировать node.js; — для Java-программиста большая часть кода – огромный чужой мир во всей красе и сложности; — как изменять этот мир под себя, решительно непонятно; — зато понятно, что делать с бэкенд-частью; — важно, что развитие JHipster идёт семимильными шагами с участием множества программистов со всего мира; — накоплена значительная база решений и FAQs.
Итого: благодаря поддержке всего, чего только можно, JHipster отлично подходит не только для CRUD-приложений, как таковых, но и для создания прототипов приложений. Прототипы с помощью флагов можно создавать вообще без фронтенда.
Пожалуй, все вопросы отпадают сами собой. Впрочем, вы всегда можете задать их в комментариях.