![](https://habrastorage.org/webt/qj/g9/ba/qjg9bajfjgd1ivwunvi_fiw49sa.jpeg)
Статья не претендует на академическую полноту и точность. Интерпретация всех изложенных фактов и приведённые примеры отражают исключительно знания, точку зрения и заблуждения автора статьи. Целью написания является попытка получения целостной картины имеющегося текущего положения для веб-приложений на Java. Кроме того, изложенная информация может быть использована читателем в качестве отправной точки для дальнейших самостоятельных исследований.
Код примеров находится в репозиториях на GitHub: демонстрация каждой библиотеки и фреймворка и приложение из завершающей части статьи. На момент написания статьи в первом репозитории 37 примеров, со временем их список будет пополняться.
Хронология появления технологий, библиотек, фреймворков и их популярность
Для более лёгкого восприятия данные сведены в таблицу и дополнительно далее проиллюстрированы диаграммами. Элементы таблицы условно объединены в группы, если это возможно. Библиотеки и фреймворки упорядочены по популярности в порядке убывания.
Информация о популярности взята из двух источников. Первым источником является индекс популярности веб-фреймворков RebelLabs компании ZeroTurnaround. Последнее его обновление было в конце 2017 года и сопровождалось двумя блогпостами до этого: первый и второй. Автор второго блогпоста, Simon Maple, перешёл в компанию Snyk, продолжив заниматься сбором и анализом подобной полезной статистики. Вторым источником является его исследование, опубликованное в журнале Java Magazine, November/December 2018 (вопрос 17).
В начало таблицы добавлен набор спецификаций, в конец таблицы — невошедшие в индекс популярности фреймворки, но которые всё же хотелось упомянуть.
№ | Технология, библиотека, фреймворк | Дата первой версии | Дата последней стабильной версии | Популярность, % | ||
---|---|---|---|---|---|---|
Тип | Подтип | RebelLabs, 2017 | Java Magazine, 2018 | |||
1 | Спецификация | Servlet | 12.1996 | 10.09.2019 | ||
JSP | 27.09.1999 | 10.09.2019 | ||||
J2EE, Java EE, Jakarta EE |
12.12.1999 | 10.09.2019 | ||||
JAX-WS | 28.10.2003 | 10.09.2019 | ||||
JSF | 11.03.2004 | 10.09.2019 | ||||
JAX-RS | 08.09.2008 | 10.09.2019 | ||||
2 | Spring | Spring MVC | 12.2005 | 02.08.2019 | 28,82 | 36 |
3 | Spring Boot | 04.2014 | 02.08.2019 | 13,35 | 40 | |
4 | Spring WebFlux | 09.2017 | 02.08.2019 | |||
5 | JavaServer Faces | Eclipse Mojarra | 03.03.2004 | 30.11.2018 | 15,2 | 19 |
6 | Apache MyFaces | 11.2005 | 23.05.2019 | |||
7 | Google Web Toolkit | 16.05.2006 | 19.10.2017 | 7,74 | 6 | |
8 | Grails | 10.2005 | 11.07.2019 | 6,35 | 3 | |
9 | Struts | 05.2000 | 09.01.2019 | 5,4 | 9 | |
10 | Dropwizard | 21.12.2011 | 07.08.2019 | 4,9 | 3 | |
11 | Play | 05.2008 | 19.06.2019 | 3,26 | 3 | |
12 | JHipster | 21.10.2013 | 20.09.2019 | 2,49 | 3 | |
13 | JAX-RS | Apache CXF | 04.2008 | 13.08.2019 | 2,44 | |
14 | RESTEasy | 09.2008 | 30.08.2019 | |||
15 | Jersey | 05.2010 | 10.09.2019 | |||
16 | Restlet | 01.2013 | 01.2018 | |||
17 | Vaadin | 2006 | 16.09.2019 | 2,15 | 5 | |
18 | Seam | 2007 | 25.07.2013 | 1,94 | ||
19 | Wicket | 06.2005 | 09.09.2019 | 1,91 | 2 | |
20 | Tapestry | 2000 | 06.09.2019 | 1,9 | ||
21 | Spark Java | 2011 | 22.05.2019 | 0,77 | ||
22 | Vert.x | 2011 | 22.08.2019 | 0,76 | ||
23 | Rapidoid | 08.2014 | 27.05.2018 | 0,25 | ||
24 | Lagom | 03.2016 | 04.09.2019 | 0,24 | ||
25 | Ratpack | 2013 | 18.08.2019 | 0,13 | ||
27 | Javalin | 24.05.2017 | 11.08.2019 | |||
26 | Micronaut | 23.10.2018 | 13.09.2019 | |||
28 | MicroProfile | TomEE | 27.04.2012 | 21.06.2019 | ||
29 | Hammock | 27.02.2014 | 05.03.2018 | |||
30 | Thorntail | 01.2016 | 17.07.2019 | |||
31 | KumuluzEE | 04.04.2016 | 29.06.2019 | |||
32 | Payara Micro | 07.2017 | 28.08.2019 | |||
33 | Open Liberty | 19.09.2017 | 06.09.2019 | |||
34 | Helidon | 19.09.2018 | 13.09.2019 |
На первой временной шкале данные из таблицы приведены в том же порядке, что и в таблице. Имеющиеся группы расположены по степени популярности. В группах (спецификация, Spring, JSF, JAX-RS, MicroProfile) элементы упорядочены в хронологическом порядке их появления. На любую из картинок можно щёлкнуть для её увеличения.
![](https://habrastorage.org/webt/et/b0/uw/etb0uwbaafp_j8tqloyy8fnkvxc.jpeg)
На второй временной шкале та же самая информация упорядочена по дате появления первой версии всех элементов. Легко увидеть, что в 2001 году, например, для написании веб-приложения можно было выбрать только из двух существующих основных фреймворков — Tapestry и Struts. В начале 2014 года никак невозможно было использовать Spring Boot (его первая официальная версия вышла позже) и уже не имело смысла использовать Seam (он прекратил существование).
![](https://habrastorage.org/webt/a9/xj/jo/a9xjjolhekhavtn7o74_j_qf5s4.jpeg)
Круговая диаграмма показывает индекс популярности фреймворка по данным RebelLabs на конец 2017 года. Каждый из фреймворков в индексе участвует один раз, то есть общая сумма процентов составляет 100. На второй диаграмме демонстрируется результат исследования из Java Magazine, 2018. В исследовании задавался вопрос, какие веб-фреймворки используются, разрешалось выбрать более одного в ответе. По этой причине каждый процентный показатель независим от другого и их нельзя суммировать.
![](https://habrastorage.org/webt/53/1l/fv/531lfvmadmysic_gcxxvmwthaoq.jpeg)
Спецификации
Краеугольный камень существования всех библиотек — стандарты и спецификации, на которых они базируются. Спецификации существуют в виде Java Specification Requests (JSR), разрабатываемых в ходе формальной процедуры, называемой Java Community Process (JCP).
Список JSR, относящихся к Java Enterprise Edition, находится здесь. Ниже в таблице представлены выбранные из них только две наиболее значимые спецификации — Servlet и Java EE (последняя является набором из других спецификаций). Первые версии спецификаций принимались не в рамках JCP, поэтому они не имеют номеров JSR.
С 12 сентября 2017 года Java EE передана под управление Eclipse Foundation и в настоящее время именуется Jakarta EE. На смену JCP в качестве процесса разработки и принятия спецификаций пришёл Jakarta EE Specification Process.
Использование HTTP-сервлетов
Далее несколько примеров создания веб-приложения без каких-либо библиотек или фреймворков. Будут последовательно даваться ссылки на расположение кода с кратким комментарием. Подобных способов больше, продемонстрированы наиболее очевидные из них.
В первом примере (модуль helloworld-web-servlet-xml) в дескрипторе развёртывания (deployment descriptor)
web.xml
указан класс, унаследованный от абстрактного класса HttpServlet со своей реализацией метода doGet(). Впервые файл web.xml
дескриптора развёртывания был упомянут в спецификации Servlet 2.2 (1999 год).Во втором примере (модуль helloworld-web-servlet-annotation) файл дескриптора развёртывания
web.xml
отсутствует. Над тем же классом-наследником от абстрактного класса HttpServlet присутствует аннотация WebServlet, появившаяся в Servlet 3.0 (2011 год).Третий пример (модули helloworld-web-servlet-interface-jar и helloworld-web-servlet-interface-war) чуть более сложен. В нём показывается использование реализации интерфейса ServletContainerInitializer, также появившегося в Servlet 3.0. В первом модуле helloworld-web-servlet-interface-jar по-прежнему нет файла дескриптора развёртывания
web.xml
, есть класс-наследник от абстрактного класса HttpServlet. Servlet 3.0 позволяет посредством реализации интерфейса ServletContainerInitializer добавлять компоненты сервлетов программно, в т.ч. выполняя регистрацию сервлетов. Класс-реализация интерфейса ServletContainerInitializer с помощью концепции Service Provider Interface (SPI) конфигурируется путём указания его имени в файле META-INF/services/javax.servlet.ServletContainerInitializer
. Первый модуль создаёт файл JAR. Файл WAR создаёт второй модуль helloworld-web-servlet-interface-war, в списке зависимостей у него указан первый модуль. Подобный подход реализации интерфейса ServletContainerInitializer используют фреймворки JSF и Spring в своих классах FacesInitializer и SpringServletContainerInitializer, соответственно.В Servlet 3.0 также появились асинхронные сервлеты, в Servlet 3.1 (2013 год) — неблокирующий ввод-вывод, в Servlet 4.0 (2017 год) — поддержка HTTP/2.
Эпоха до появления Spring
![tapestry](https://habrastorage.org/webt/tr/g_/an/trg_an8lbrblfc7xovhsva1qeo8.jpeg)
![struts](https://habrastorage.org/webt/yk/g1/xf/ykg1xfg-zpclmbuto7rbaq2gfoa.jpeg)
web.xml
указание в качестве фильтра класса StrutsPrepareAndExecuteFilter
. Данный класс служит диспетчером запросов, выбирающим соответствующее запросу действие (action). Apache Struts также, как и Tapestry, основан на шаблоне проектирования MVC.![jsf](https://habrastorage.org/webt/h0/zq/nq/h0zqnqgvxksqch-d3ypcpmuw_-k.jpeg)
![wicket](https://habrastorage.org/webt/8u/ft/vg/8uftvg3ngpefi4laaiko5hpzxbe.jpeg)
![grails](https://habrastorage.org/webt/xk/91/qb/xk91qbvrxc9zp2gcajgtpknosh4.jpeg)
Spring MVC, Spring Boot и Spring WebFlux
![spring](https://habrastorage.org/webt/le/nx/fr/lenxfrqrgouqgij7nlvogxf8bny.jpeg)
В первом примере (модуль helloworld-web-spring-mvc-xml) в файле дескриптора развёртывания
web.xml
указан в качестве сервлета DispatcherServlet. В контроллере с единственным методом, обрабатывающим GET-запрос, присутствуют соответствующие аннотации (Controller и RequestMapping). Представлением (view) служит JSP-файл.Во втором примере (модуль helloworld-web-spring-mvc-java) файл дескриптора развёртывания
web.xml
отсутствует и используется возможность, появившаяся в Servlet 3.0, выполнять конфигурирование программно. Совместно применяется класс, унаследованный от AbstractAnnotationConfigDispatcherServletInitializer (в конечном итоге задействуется реализация интерфейса ServletContainerInitializer с SPI), и JavaConfig (конфигурация с помощью программного кода с аннотацией Configuration).В третьем примере (модуль helloworld-web-spring-boot-mvc) демонстрируется значительное упрощение проекта при сохранении той же функциональности благодаря появлению Spring Boot. Кроме класса контроллера дополнительно существует лишь один класс, унаследованный от SpringBootServletInitializer и аннотированный SpringBootApplication.
Четвёртый пример (модуль helloworld-web-spring-boot-webflux) показывает вместе со Spring Boot применение Spring WebFlux, добавленного в Spring Framework относительно недавно. Spring WebFlux использует реактивные принципы и Project Reactor. Из двух основных подходов (функциональный стиль и основанный на аннотациях) в примере участвует первый.
После появления Spring, 2000-е годы
![vaadin](https://habrastorage.org/webt/po/7-/38/po7-38mj_ithzp2ujkrjjztbsle.jpeg)
![gwt](https://habrastorage.org/webt/pq/ol/48/pqol48dwuvhfod2eydrhzblc8zk.jpeg)
![seam](https://habrastorage.org/webt/i5/ki/6r/i5ki6rbpw9_vspenfdkmrhvrglg.jpeg)
![jax-rs](https://habrastorage.org/webt/fx/fa/ph/fxfaph5za35nfdoen9svrroeqs0.jpeg)
![play](https://habrastorage.org/webt/ol/-v/2k/ol-v2kbtfe7zbj5tluyymeyqdn0.jpeg)
2010-е годы, новейшее время
![sparkjava](https://habrastorage.org/webt/ab/fq/nr/abfqnra85rfiulmqfj6kyvlcljy.jpeg)
![vertx](https://habrastorage.org/webt/_x/1x/ei/_x1xei0wo6ir9inozxq7oypmvsw.jpeg)
![dropwizard](https://habrastorage.org/webt/ys/pk/lc/yspklczjystrz929vci0muatols.jpeg)
![ratpack](https://habrastorage.org/webt/tw/zx/gc/twzxgci8g3scjpxdwaqzp1fd86g.jpeg)
![jhipster](https://habrastorage.org/webt/af/ba/xc/afbaxcsmp_ka4xkktseyj1llu8g.jpeg)
![rapidoid](https://habrastorage.org/webt/cg/5c/vd/cg5cvd5hpo3ocvlammhf0scjoaa.jpeg)
![lagom](https://habrastorage.org/webt/d5/0g/zc/d50gzcqdjpmne7rzx07efxogfbq.jpeg)
![javalin](https://habrastorage.org/webt/zn/ei/ma/zneima0hxzzngropy_dqng653xu.jpeg)
![micronaut](https://habrastorage.org/webt/kf/a2/d9/kfa2d9tqjdoquuhjyohaf3otkhc.jpeg)
MicroProfile
![microprofile](https://habrastorage.org/webt/q-/y-/2a/q-y-2agegsezg3_l-ryra_mfqq4.jpeg)
№ | Спецификация | Версия MicroProfile | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 2.0 | 2.1 | 2.2 | 3.0 | ||
1 | CDI | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 2.0 | 2.0 | 2.0 | 2.0 |
2 | Config | 1.0 | 1.1 | 1.2 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | |
3 | Fault Tolerance | 1.0 | 1.0 | 1.1 | 1.1 | 1.1 | 2.0 | 2.0 | ||
4 | Health | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 2.0 | ||
5 | JAX-RS | 2.0 | 2.0 | 2.0 | 2.0 | 2.0 | 2.1 | 2.1 | 2.1 | 2.1 |
6 | JSON-B | 1.0 | 1.0 | 1.0 | 1.0 | |||||
7 | JSON-P | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.1 | 1.1 | 1.1 | 1.1 |
8 | JWT Auth | 1.0 | 1.0 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | ||
9 | Metrics | 1.0 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 2.0 | ||
10 | Open API | 1.0 | 1.0 | 1.0 | 1.0 | 1.1 | 1.1 | |||
11 | Open Tracing | 1.0 | 1.1 | 1.1 | 1.2 | 1.3 | 1.3 | |||
12 | Type Safe Rest Client | 1.0 | 1.1 | 1.1 | 1.1 | 1.2 | 1.3 |
В настоящее время существуют веб-фреймворки, удовлетворяющие MicroProfile в разной степени. Для демонстрации было выбрано семь из них, ниже приведено соответствие версий фреймворков версиям MicroProfile. Полная информация обо всех существующих фреймворках, реализующих MicroProfile, находится здесь.
№ | Фреймворк | Версия MicroProfile | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 2.0 | 2.1 | 2.2 | 3.0 | ||
1 | TomEE | 7.1.0 | 8.0.0-M1 | 8.0.0-M2 | 8.0.0-M3 | |||||
2 | Hammock | 2.0 | ||||||||
3 | Thorntail | 2.1.0. Final |
2.3.0. Final |
2.4.0. Final |
2.5.0. Final |
|||||
4 | KumuluzEE | 2.1.0 | 2.5.2 | 3.0.0 | 3.2.0 | 3.2.0 | 3.2.0 | 3.2.0 | 3.5.0 | |
5 | Payara Micro | 174 | 181 | 182 | 183 | 183 | 191 | 192 | ||
6 | Open Liberty | 17.0. 0.3 |
18.0. 0.1 |
18.0. 0.3 |
18.0. 0.3 |
18.0. 0.4 |
19.0. 0.3 |
19.0. 0.7 |
||
7 | Helidon | 0.9.4 | 1.0 | 1.2.0 | 1.2.0 | 1.2.0 | 1.2.0 | 1.2.0 |
![microprofile1](https://habrastorage.org/webt/gb/1b/en/gb1benzkpddbjom3alclfkf-jj8.jpeg)
![microprofile2](https://habrastorage.org/webt/yl/8o/w-/yl8ow-evupku-k49dnyowrg1g6a.jpeg)
Сервлет-контейнеры и серверы приложений
Веб-приложения исполняются в специализированном программном обеспечении, реализующем соответствующие спецификации (например, Servlet API). Ниже приведены наиболее популярные на данный момент сервлет-контейнеры и серверы приложений. Процент популярности также взят из результатов исследования (вопрос 20).
№ | Сервлет-контейнер, серверы приложений | Дата первой версии | Дата последней стабильной версии | Популярность, % | |
---|---|---|---|---|---|
Семейство | Наименование | ||||
1 | Tomcat | Tomcat | 11.1998 | 17.08.2019 | 41 |
2 | TomEE | 04.2012 | 21.06.2019 | ||
3 | JBoss | JBoss EAP | 1999 | 22.01.2019 | 15 |
4 | WildFly | 1999 | 03.07.2019 | ||
5 | Jetty | 2000 | 14.08.2019 | 9 | |
6 | WebLogic Server | 11.1997 | 30.08.2017 | 6 | |
7 | WebSphere | WebSphere Application Server | 1998 | 02.04.2019 | 5 |
8 | Open Liberty | 09.2017 | 14.08.2019 | ||
9 | GlassFish | GlassFish Server | 06.06.2005 | 28.01.2019 | 5 |
10 | Payara Server | 31.10.2014 | 29.08.2019 |
Временная шкала показывает время жизни каждого из программных продуктов таблицы. Можно видеть последовательность их появления и время выпуска последних версий.
![](https://habrastorage.org/webt/-p/cf/zc/-pcfzc_8wh-hulxx-myx3xayyki.jpeg)
Всё чаще сейчас используется контейнеризация при развёртывании и публикации приложений, поэтому применение серверов приложений становится всё менее актуальным.
Использование в приложениях языков, отличных от Java
В последнее время наметилась тенденция создания гибридных приложений, в качестве одной из составных частей которых присутствует код на Java. В соответствии с тенденцией в журнале Java Magazine, основной темой которого был язык программирования Java, в колонке главного редактора в номере January/February 2017 было провозглашено «The Polyglot Future» и включение в зону интересов языка JavaScript.
В уже упомянутом выше исследовании в вопросе номер 16 интересовались, какие не JVM-языки используются в JVM-приложениях. Лидером (57%) стал JavaScript, применяемый во фронтенде. Учитывая тот факт, что часть веб-приложений не имеют GUI вовсе (сервисы, микросервисы, службы), можно с уверенностью сказать, что использование JavaScript-фреймворков для графического интерфейса в Java-приложениях носит массовый характер.
![](https://habrastorage.org/webt/as/5j/cv/as5jcvwwhjiy6kuxuztozochrgy.jpeg)
Пример типичного сегодняшнего Java-приложения
![](https://habrastorage.org/webt/na/-q/p5/na-qp53uw1h5f4uuzlz0vddyzki.jpeg)
Бекенд написан с использованием Spring Boot, фронтенд — с помощью популярного JavaScript-фреймворка Angular. В Java-части приложения максимально представлены составные части семейства Spring: Spring MVC, Spring Boot, Spring Security, Spring Test, Spring Boot Admin. REST API бекенда визуализируется с помощью Swagger.
Для тестирования применяются совершенно обычные для подобного приложения JUnit, Spring Test, Mockito, TestContainers (unit- и интеграционное тестирование Java-части) и Jasmine с Protractor (unit- и end-to-end-тестирование для JavaScript и Angular).
Аналогичную архитектуру и набор использованных фреймворков (Spring Boot и Angular) имеет игра Угадай спикера, упоминавшаяся в недавнем обзоре конференции TechTrain 2019.
Выводы
Процессы развития как языка программирования Java, так и построения с его помощью веб-приложений, продолжаются. Можно и нужно внимательно наблюдать за ними, не забывая последовательности событий, спецификаций, библиотек и фреймворков, приведших к текущему положению вещей.
Код примеров и программ, упоминавшихся в статье, находится на GitHub: первый, второй и третий репозитории.
- «Spring the Ripper», Евгений Борисов (JPoint 2014: видео, презентация)
- «Spring Data? Да, та!», Евгений Борисов (Joker 2014: видео, презентация)
- «Spring Puzzlers: тонкости и нюансы работы Spring», Евгений Борисов (Joker 2014: видео)
- «Spring Puzzlers — Начало», Барух Садогурский и Евгений Борисов (JPoint 2015: видео, презентация)
- «The Bootiful Application», Josh Long (Joker 2015: видео, презентация)
- «Твой личный Spring Boot Starter», Кирилл Толкачёв и Александр Тарасов (JPoint 2016: видео, презентация)
- «Spring – Глубоко и не очень», Евгений Борисов (JPoint 2017: видео, презентация)
- «Проклятие Spring Test», Кирилл Толкачев и Евгений Борисов (JPoint 2017: видео, презентация)
- «Boot yourself, Spring is coming», Кирилл Толкачев и Евгений Борисов (Joker 2017: видео)
- «Дизайн реактивной системы на Spring 5/Reactor», Максим Гореликов (Joker 2017: видео)
- «Spring Framework 5.0 on JDK 8 & 9», Juergen Hoeller (JPoint 2018: видео, презентация)
- «Spring Framework 5: feature highlights and hidden gems», Juergen Hoeller (JPoint 2018: видео, презентация)
- «Camel microservices with Spring Boot and Kubernetes», Claus Ibsen (JPoint 2018: видео, презентация)
- «Spring Boot и Xtend: сеанс чёрной магии c разоблачением», Андрей Когунь (JPoint 2018: видео, презентация)
- «Boot yourself, Spring is coming», Кирилл Толкачев и Евгений Борисов (JPoint 2018: видео часть 1 и часть 2, презентация)
- «Spring Boot 2: чего не пишут в release notes», Владимир Плизга (Joker 2018: видео, презентация)
- «The Proxy fairy and the magic of Spring», Victor Rentea (JPoint 2019: видео, презентация)
- «Нас Spring Boot, а мы крепчаем: невыносимая легкость AOT-компиляции Spring-приложений», Никита Липский (JPoint 2019: видео, презентация)
- «Reactive или не reactive, вот в чем вопрос», Кирилл Толкачёв и Евгений Борисов (JPoint 2019: видео, презентация)
- «Перевод Spring Boot-микросервисов с Java 8 на 11: что может пойти не так?», Владимир Плизга (JPoint 2019: видео, презентация)
Play:
- «50 оттенков Play!», Андрей Солнцев (Joker 2015: видео)
Vaadin:
- «Хочется странного — web UI на Java для desktop-приложений», Юрий Артамонов (JPoint 2018: видео, презентация)
- «Анатомия и физиология Vaadin Flow», Юрий Артамонов (JPoint 2019: видео, презентация)
Vert.x:
- «Vert.x: руководство по эксплуатации», Владимир Красильщик (Joker 2015: видео)
- «Vert.x: Красавица и Чудовище», Владимир Красильщик (Joker 2016: видео, презентация)
- «Реактивное программирование на Vert.x », Антон Ленок (JPoint 2018: видео, презентация)
Micronaut:
- «Micronaut vs Spring Boot, или Кто тут самый маленький?», Кирилл Толкачёв и Максим Гореликов (Joker 2018: видео, презентация)
MicroProfile:
- «Microprofile.io: не Спрингом единым», Дмитрий Александров (Joker 2018: видео, презентация)
Java и JavaScript:
- «JavaScript in the Еnterprise», Markus Eisele (Joker 2014: видео, презентация)
- «Java(Script) on JVM», Дмитрий Александров (Joker 2015: видео)
25-26 октября 2019 года в Санкт-Петербурге состоится конференция для Java-разработчиков Joker 2019, на которую до 1 октября можно дешевле купить билеты.
8-9 ноября 2019 года в Москве пройдёт конференция для JavaScript-разработчиков HolyJS 2019 Moscow, на которую до 1 октября тоже действуют скидки на покупку билетов.
Комментарии (26)
pin2t
23.09.2019 09:53+1Разработчики Spark прям молодцы, как минимум пишут код на Java, а не на аннотациях вперемешку с XML-ем. Хороший фреймворк.
stranger_shaman
23.09.2019 13:31+1Spark же на Scala был?
dbelob Автор
23.09.2019 13:55+1Apache Spark (сайт, репозиторий на GitHub) и Spark Framework (сайт, репозиторий на GitHub) — два разных продукта. В статье упоминается Spark Framework, он же Spark Java.
trix
23.09.2019 16:58+1Вездесущий Спринг сейчас даже не даёт начинающим разработчикам шанса задуматься, что можно как-то иначе :)
pin2t
23.09.2019 17:22+1Вот именно. Плюс из-за этого ещё ругают Java мол многословный язык. А вот разработчики Spark доказали что можно и на Java писать лаконично и понятно, если просто не писать всякую лишнюю ерунду. У них на сайте есть примерчик REST API с использованием Sql2o, вообще нормально получается по-моему.
pavel_77
23.09.2019 18:17+1Лично я, придя в Java из C# был слегка шокирован таким разнообразием фреймворков. Хотя, как отмечали ранее, большинство начинающих разработчиков ориентируются только на Spring
pin2t
23.09.2019 20:25+2ну С# он к винде почти прибит гвоздями, а винда не то чтобы очень популярная платформа для хостинга веб-приложений. Скорее для десктопа. А Java везде.
dbelob Автор
23.09.2019 21:56С удовольствием для расширения кругозора и для сравнения прочитал бы статью, как менялись подходы для создания веб-приложений на платформе .NET за всё время её существования.
Если такая статья уже существует, вдруг кто-то приведёт на неё ссылку в комментариях, было бы интересно. Если статьи нет, возможно, подобная статья на Хабре была бы интересна не только мне (по крайней мере, на плюсик за статью от меня можно точно рассчитывать :).
dbelob Автор
26.09.2019 12:40Spring занимает доминирующее положение сегодня вполне заслуженно. Для того, чтобы таким стать, ему нужны были предшественники, чтобы оставаться первым — конкуренты для впитывания новых идей.
На конференции Joker ровно через месяц очередной раз будет возможность увидеть и услышать Juergen Hoeller, основного разработчика Spring Framework. Кроме него на этой же конференции будут также доклады его коллег из Pivotal: Josh Long (developer advocate, Java Champion), Mark Heckler («Spring Developer & Advocate», Java Champion) и Сергея Егорова (соавтор Testcontainers, бывший коллега упомянутого в статье Simon Maple).
javax
25.09.2019 20:08+1А ведь всё начиналось с апплетов :)
dbelob Автор
25.09.2019 22:00Решил всё-таки ограничить время повествования «от появления спецификации сервлетов» в том числе и потому, что при написании примера с Java-апплетом возникли бы проблемы с его запуском на новых версиях Java (апплеты были исключены, начиная с Java SE 11).
С некоторой долей натяжки тогда и Java Web Start можно было бы отнести к веб-приложениям.
Revenant20
27.09.2019 08:07+2Мне кажется забыли Quarkus от Red Hat.
dbelob Автор
27.09.2019 13:10Вы прямо читаете мысли — после посещения вчерашней встречи jug.msk.ru (презентация уже доступна, про Quarkus там несколько слайдов) сегодня добавил пример использования Quarkus.
В статью включение считаю преждевременным, т.к. Quarkus пока даже не достиг первой стабильной версии.
Throwable
27.09.2019 16:59+1Восходящая звезда среди веб-фреймворков, первая версия для которой появилась всего год назад, в октябре 2018 года, — Micronaut.… Существенное его преимущество — быстрый старт приложений на его основе и малое потребление памяти.
Вот ни разу старт не быстрый. Несмотря на то, что контекст связывается на этапе компиляции, и в рантайме не делается claspath-scan. https://habr.com/ru/company/raiffeisenbank/blog/456376/
Быстрый старт — это Jetty, Javalin, Spark Framework, Vaadin (внезапно!)dbelob Автор
27.09.2019 19:02Утверждение «быстрый старт приложений» про Micronaut не противоречит приведённым в статье измерениям времени запуска — он значительно быстрее приложений на основе Spring Boot.
Fox_exe
Наглядный пример высказывания «Вместо того, чтобы развивать чтото одно, каждый придумывает чтото своё»…
Хотя… Может это просто я «Устарел» и чегото не понимаю?
adictive_max
DieSlogan
С одной стороны — да, согласен с вами. С другой стороны у нас классический пример, когда проект использует log4j, а также spring boot и получает class not found exception, потому что spring boot использует slf4j. Очень часто приложения разрастаются до неприличных размеров только из-за того, чтобы подружить вот эти диаметрально противоположные подходы.
hexploy
Справедливости ради, конкретно в случае логирования slf4j стоит только поблагодарить. Иначе пришлось бы тянуть не выбранную реализацию+slf4j а сразу весь зоопарк log4j, log4j2, logback, jcl и кто знает что ещё.
vvbob
Если бы человечество придерживалось такого принципа, то мы бы до сих пор бегали бы за мамонтами в очень продуманных шкурах, с весьма навороченными каменными топорами.
NeverIn
Конечно, прогресс это хорошо, просто не все за ним поспевают. Бумажные книги перестали быть актуальными, не поспевают. Точка сингулярности близко.
mad_nazgul
Здоровая конкуренция. :-)
По идее, все должно быть в рамках JCP, но из-за «фатальных недостатков» такое разброд и шатание.
dbelob Автор
Прогресс всё-таки есть — теперь разброд и шатание находится уже в рамках JESP :)
mad_nazgul
Значит и у JCP есть «фатальный недостаток» :-)