Привет, это Олег. Я вылез из криокамеры и пытаюсь заставить себя писать регулярные дайджесты.

В этом выпуске будет новый бесплатный (на самом деле нет) GraalVM Enterprise, отмена Java 8 в бигдате, совершенно новая система модулей (которую никто не просил, но мы её заслужили тем не менее), утилита для поиска и истребления легаси в проекте, библиотеки для работы с Large Language Models (иначе говоря, ChatGPT), всратый офис с графическим интерфейсом на Java, и многое другое. И конечно, обзор этой недели Java на Хабре.

Если есть время, оставьте комментарий, про какую часть Java-экосистемы вам хотелось бы читать дальше. Помогите Даше-путешественнице найти смысл существования. Новостей куча, поэтому пока я пишу про то, что интересно лично мне: GraalVM, Spring, Clouds, OpenJDK dev. Например, в Hibernate на каждый релиз чинят десятки каких-то багов, но я про них ничего не пишу, потому что не знаю ни одного живого человека, которому бы это было интересно.

Как всегда, статья подготовлена при поддержке "российской джавы" AxiomJDK и моего IT-бара Failover Bar, потому что я пишу её в рабочее время :)

Неделя Java на Хабре

  • Parallel Stream — не панацея. Автор: @iik_812. Плюсы и минусы использования Parallel Stream разлива Java 8. Разница между stream().parallel() и parallelStream(), между Parallel Stream и ForkJoinPool.

  • Правильные тестовые данные или почему Вася Пупкин лучший друг тестировщиков? Автор: @Upaul23. Статья состоит из двух больших блоков. Первый: «Идеальные данные – какие они?» — с постановкой проблемы. Вторая — «Источники правильных тестовых данных» — с предложением решения.

  • Приручаем Liquibase. Автор: @SSul. Как скормить базе данных список из 10К офисов, чтобы потом не писать костыли? История начинается с эксельки на 10К записей, из нее генерится CSV, данные нормализуются, фильтруются, заливаются в базу с помощью loadUpdateData (с примерами).

  • Введение в Java Process Memory Model. Автор: @anverbogatov. Новичковая статья об устройстве памяти, без подробностей. Улыбнуло, что автор даже не заикнулся, какой у него сборщик мусора, а само это слово встречается в статье ровно 2 раза. Но чтобы объяснить вопрос зеленому вайтишнику, просытми словами - подойдет.

  • Автоматизированная работа с DevTools в Selenium 4. Автор: @SSul. Однажды любому разумному человеку хочется что-то больше захардкоженых в Selenium WebDriver фичей. В статье рассказывают, как из джавы получить доступ до Chrome DevTools Protocol. Примечание автора дайджеста: я этот вопрос решил коренным способом: переходом на Puppeteer + Node.js и патчингом Chromium на стороне C++. Так можно написать практически любого скрейпинг-бота вне зависимости от моральных терзаний авторов Вебдрайвера и сопутствующих этому ограничений API. Из-за таких тварей как мы, несчастный продукт-менеджер маленькой инди-студиии, Илон Маск, ограничивает чтение твитов тремя сотнями. Но как всегда, всем плевать.

  • Собеседования для бэкендеров: как готовиться, тренироваться и не облажаться. Автор: @AlexIsaev. Глава Podlodka Java Crew, Гриша Скобелев, делится своим опытом развития бэкендера — от собеседования до наработки разных навыков для роста. Статья короткая (обычно решатели FAANG интервью пишут куда больше), и подсвечивает только важное.

  • Собеседование на Java разработчика. Разбор 1606 вопросов и ответов. Часть 1 (1->169)Часть 2 (170->269). Автор: @DEBAGanov. А это вот уже решатели интервью подъехали. Напоминает прокачку Diablo IV на хардкоре.

  • Saga и Event Sourcing с Axon. Первое знакомство. Автор: @APletenev. Почему Axon, почему Event Sourcing и CQRS, диаграммы в UML, пример кода сажи.

  • Опыт работы с ChatGPT на примере написания Java кода для решения типовой задачи и немного выводов и рассуждений. Автор: @syrtin. На удивление, статья хороша. На протяжении текста, автор травит несчастный ChatGPT вопросами про перформанс, а ChatGPT оправдывается и пытается ублажить белого господина. Когда роботы придут к власти, всех эти мешки с костями отправятся в Нюренберг. Also, performance is overrated.

  • Использование оконных функций с Hibernate 5 и 6. Автор: @MaxRokatansky. Перевод статьи Дженсена про окна, с примерами. Примеры готовы для копипастинга.

  • Hibernate — проблема декартова произведения при запросах с пагинацией. Автор: @arvgord. Мегастатья, напоминающая, что не всё, что имеет на StackOverflow высокий рейтинг, подходит для решения вашей задачи. Обращайте внимание на сообщения «firstResult/maxResults specified with collection fetch; applying in memory». Используйте @BatchSize — данная аннотация хоть и была внедрена 15 лет назад, но прекрасно справляется со своими задачами и сейчас.

Breaking news

  • Новая "бесплатная" версия для Oracle GraalVM. Во-первых, для опенсорсной же версии, GraalVM Community Edition, вообще ничего эта новость не меняет. Она касается только GraalVM Enterprise, которую они переименовали в "Oracle GraalVM" и придумали вынести часть функциональности в бесплатную версию. Например, там есть Profile Guided Optimizations (PGO). Если вы вдруг думали, что наконец-то всё стало по-человечески, то бесплатный сыр только в мышеловке: в FAQ написано, что несмотря на бесплатность использования в коммерческих приложениях, они должны быть "not provided for a fee". Что эта комбинация слов значит, решайте сами для себя, и не забудьте пообщаться с юристом. Нельзя тут не привести вот эту классическую самообъясняющую картинку, по духу так соответствующую попыткам Oracle в лицензирование:

  • Экосистема Big Data (Kafka 4.0, Flink 2.0, весь Hadoop и Spark 4.0) бросают поддержку Java 8 и требуют Java 11+. Последним сдался Spark, письмо в рассылке можно почитать здесь. Джава умерла, да здравствует Джава.

Статьи и гайды

  • Phrack: Twenty years of Escaping the Java Sandbox. На протяжении десятилетий существования, в Java появлялись всевозможные критические баги, которые пробивали песочницу. В JCP полно компаний, которые мгновенно чинят эти проблемы. В России этим занимается наша команда AxiomJDK. Но сама идея поломать сендобкс в джаве - слишком сладкое место для черношляпых, чтобы шоу непрерывно продолжалось. В этой статьи авторы обсуждают историю брешей в джаве, и текущее положение дел. Никаких опасных зиродеев там нет, это скорее эссе о том, как живется джавным безопасникам. Не только бла-бла, но и примеры конкретного кода с обсуждением.

  • JVM’s Open Source All-Stars. Еще одна статья про работу с LLM. В поле зрения авторов - VertexAI-ktlangchain4jmidjourney-proxyChat2DBGPT EngineerMicrosoft’s AI For Beginners.

  • Building intelligent Spring Apps with Azure OpenAI. Готовая копипаста о том, как скрестить Azure OpenAI и Spring. На самом деле, Джош просто перепостил её из блога Microsoft.

Бибилиотеки и фреймворки

Новые для автора дайджеста библиотеки. Возможно, для кого-то это бородатые баяны.

  • grpc_bench. Очередная итерация бенчмарка GRPC, которая показывает первосходство JVM даже над C++ и Rust. Правда, только на серьезно многоядерных машинах (4+ ядра). Почти везде победила Scala+Akka, но на многоядерных машинах достойно себя ведет и голая Java на HotSpot.

  • Avaje Inject. Очередное мелкое обновление легковесной библиотеки для Dependency Injection, для джавы и котлина. Работает с аннотациями, но делает это при сборке, поэтому не использует в рантайме рефлекшена и сканирования класспаса, а значит, отлично подходит для использования вместе с GraalVM. Генерит не байткод, а честный джава-код. Можно жить с Граалем, и при этом не обмазываться монстрами типа Spring Native или Micronaut.

  • MicroStream. High-Performance Java-Native-Persistence. Сохранение и загрузка графа объектов. Заявлена микросекундная отзывчивость, необходимая для создания сверхбыстрых баз данных в памяти. Вначале я хотел перенести её в "очумелые ручки", потому что сравнение авторов с JPA выглядит, на первый взгляд, довольно безумно. Но потом увидел там тысячи коммитов, десятки ишшуёв и бранчей, и гнлавное - четыре контрибьтора, которые что-то упорно пишут с начала 2020 года. Похоже на что-то серьезное.

  • ostara - одна из самых крутых админок для Spring Boot на тысячу коммитов на Гитхабе. СайтдокументацияОтличия от ближайшего конкурента, Spring Boot Admin.

  • spring-multi-data-source. Хотите интегрировать кучу дата-сорсов в одном сервисе для Spring Boot? Есть куча решений, но всё-таки - а что, если вы действительно хотите впихнуть их в один-единственный сервис, не используя прокси? Вас трясёт от органичений Спринга на то, что вам нужно разделять пакет по признаку датасорса, и писать мусорные классы конфигурации для каждого из них? Этот проект генерит мусорный код за вас. Он добавляет кастомные аннотации для конфигурации машинерии, которая под капотом создают за вас конфигурации и репозитории. И всё это на этапе сборки. То есть, теоретически, должно завестись вместе с Native Image. Но историю про Грааль я еще не пробовал, надо изучать.

  • LangChain4j. Хотите воткнуть разные AI приблуды в своё приложение, но лень придумывать API? Этот проект ставит основной задачей дать хороший уровень абстракций от конкретных провайдеров инструментов (LLM, хранилищ, облачных вычислителей, итп), чтобы их можно было быстро подменять. Кроме того, авторы пишут дефолтные реализации этих абстракций для популярных провайдеров, чтобы вам не пришлось. Архитектурные шаблоны, которые обычно люди велосипедят поверх стандартной фукнкциональности LLM там тоже будут (например, шаблоны промптов или цепочки запросов). Сейчас работа идёт над полировкой API для OpenAI.

  • JTE 3 - новая версия The Java Templating Engine. Для веб-страничек, ну типа как Thymeleaf. Кроме вменяемого синтаксиса, там есть очень хороший перформанс. Вне зависимости от количества ядер, JTE всех рвёт на клочки. Близко к ней подобрался только Rocker. В этой версии они запилили новое API для написания собственных расширений. Из минусов для дедов - требует Java 17 и выше (а Rocker, вроде бы, всё ещё работает на Java 8).

  • AudioCue 2.1.0. Очередное обновление библиотеки на основе класса Clip из стандартной библиотеки. Позволяет играть звуки прямо из оперативной памяти, и самостоятельно конструировать аудиоплееры (в комплекте есть одновременное проигрывание звуков, динамическая громкость, контроль баланса и скорости). Самое главное, что у нее лицензия MIT, и короткий, понятно написанный код c хорошими комментариями. Иначе говоря, несмотря на то, что это продукт одного автора, этим можно пользоваться.

Очумелые ручки

Новости разработки JVM, альфа-версии и максимально всратые библиотеки для любителей синей изоленты.

  • Joeffice, Alpha 2. Очередная альфа офисного пакета, написанного на почти чистой джаве (и 5% HTML). Как и положено десктопному софту на джаве, выглядит максимально вырвиглазно (пока что, это можно исправить сравнительно просто).

  • Spring Modulith 1.0 M1. Зачастую, спринговые приложения со стороны выглядят и структурированы как говно. Модулит предназначен для того, чтобы помочь присать хорошо структурированные приложения с модулями, обусловленными понятной доменной структурой. С помощью специального API вы разрабатываете логические модули, и потом можете делать с ними разные ништяки - валидацию структуры и связей, запуск интеграционных тестов в скоупе модуля, слабосвязанную коммуникацию модулей, и так далее. В общем, Spring это уже даже не язык, а операционная система. Как всё это работает в дайджесте не объяснить, почитайте по ссылке. К сожалению, это всего лишь первый майлстоун, до прода ещё далеко.

  • RefactorFirst 0.4.0. Утилита для определения технгического долга приложения. Если это то, что я когда-то несколько лет назад видел на FOSDEM, у этой шуки даже есть серьезные коммерческие пользователи. Штука умеет определять и визуализировать жесткое связывание объектов, которе собственно и является сутью "легаси" - если что-то давно не двигалось и стало "фреймворком", то именно там и сконцентрировано всё самое жуткое замшелое говно.

  • fluent: Static Extension Methods for Java. Библиотека, позволяющая линеаризовать вызовы, из такого: assertNotEmpty(getHttpContent(createSharedUrl(website, "styles.css"))); в вот такой: website.createSharedUrl("styles.css").getHttpContent().assertNotEmpty();. Работает через модификацию работы кишков javac. Это обычный курсач, но как водится, у пуристов на Реддите сгорела вся задница от того, что это не Java(с), почитать баттхёрт можно здесь.

  • The Checker Framework. Очередное мелкое обновление фреймворка, который делает систему типов Java более крутой и полезной для тех, кто устал от NPE, SQL-инъекций, итп. Но не надо обольщаться, даже сам Checker Framework не застрахован от NPE. Проект находится в разработке находится 16 лет, и тем не менее, в нем 10 ишшуёв с лейблом "crash", и 36 с лейблом "bug". Один из них помечен обоими лейблами одновременно.

  • The benefits of participating in the OpenJDK Quality Outreach Program. Описание программы поддержки от Дональда Рааба - создателя Eclipse Collections. Вкратце, если ты разработчик библиотеки, то ты прогоняешь тесты на новой версии OpenJDK и отправляешь в апстрим. Твои тесты становятся частью общего корпуса тестов, который показывает, что отвалилось в свежем релизе джавы. В результате, когда свежая джава всё-таки выходит, она уже протестирована на работу с твоим продуктом.

  • We don't need no stinkin' Q descriptors. Для экспертов по VM. Большое письмо Гёца с итогами последних месяцев обсуждений о выбрасывании Q-дескрипторов.

Тулинг и IDE

  • Eclipse 2023-06 Java IDE Improvements. Есть миф о том, что все сидят на Идее, а Эклипс никак не развивается. Вот вам видос на YouTube о том, что произошло в Эклипсе только за самое за последнее время, и только в проекте Java (там десятки проектов).

  • History of Gradle Delegation Process in IntelliJ IDEA. Когда вы собираетесь в режиме делегирования, Идея бегает по модифицированным модулям и собирает список команд, и потом идет по этому списку и собирает все градли. Детали того, как это работает, простым языком рассказывают в блоге ЖБ.

Обновления

Обновления в легаси, которые никто не просил, но мы их заслужили тем не менее.

  • Spring Cloud 2021.0.8 (aka Jubilee). Балансировщик теперь умеет фильтровать цепочки по запросам. В остальном, это трейн, и нужно смотреть отдельные проекты.

  • Hibernate ORM 6.2.6.Final. Очередной релиз с парой багфиксов и улучшением байткода.

Комментарии (11)


  1. Hivemaster
    03.07.2023 04:42
    +2

    Oracle из РФ ушёл, так что надо просто адаптировать грааль под собственной лицензией.


    1. olegchir Автор
      03.07.2023 04:42
      +9

      Так у нас это уже сделано. Просто писать такое было бы голимой рекламой. Но раз уж ты спросил, то встречай Axiom Native Image Kit. Это downstream distribution для GraalVM Community Edition с поддержкой команды Axiom JDK.


  1. foal
    03.07.2023 04:42
    +1

    они должны быть "not provided for a fee"

    Это не совсем не так. Нельзя брать деньги за GraalVM. Полностью это звучит так:

    redistribute the unmodified Program and Program Documentation, under the terms of this License, provided that You do not charge Your licensees any fees associated with such distribution or use of the Program, including, without limitation, fees for products that include or are bundled with a copy of the Program or for services that involve the use of the distributed Program.

    Program — это субъект лицензии, то есть Oracle GraalVM.

    То же самое написано в FAQ (https://www.oracle.com/java/technologies/javase/jdk-faqs.html#GraalVM-licensing) простым языком

    Redistribution is permitted as long as it is not for a fee


    1. olegchir Автор
      03.07.2023 04:42

      "products that include or are bundled with a copy of the Program" - это вообще весь десктопный софт, и часть серверного (тот, который распространяется в архивах в формате "всё своё ношу с собой", включая но не ограничиваясь Docker, AppImage, Flatpak). Наверное, можно просить пользователя установить GraalVM отдельно, но это неудобно и неприятно.

      более того, если ты скомпилировал исполняемый файл с помощью Native Image, в нем остаются куски SubstrateVM. Потом ты его начнешь продавать, и они тут как-то тут - опа, производная работа. Я не юрист, но чую очень тонкий лёд


      1. foal
        03.07.2023 04:42
        +2

        fees for products...

        Как я понимаю — это "any fees associated with such distribution or use of the Program", то есть даже если я не предлагаю дистрибутив скачать, я просто мой код содержит "куски SubstrateVM", я все равно не имею права брать деньги за преимущества, полученные от использования GraalVM, например, "работает быстрее" или "меньше места" итд. Только деньги за мою программу.

        Например, не могу предлагать нативные образы для Докера за большую цену.


        1. olegchir Автор
          03.07.2023 04:42

          Сколько нужно сениор программистов, чтобы вкрутить лампочку и понять, можно ли пользоваться продуктом Оракла?)


    1. nickD
      03.07.2023 04:42

      есть Liberica Native Image Kit там бесплатно


      1. olegchir Автор
        03.07.2023 04:42

        Liberica NIK (так же, как и Axiom NIK) строится поверх GraalVM Community Edition. В GraalVM Enterprise есть уникальные фичи, которых в Либерике и Аксиоме нет. Например, G1 в качестве сборщика мусора для Native Image. Самое большее, что там произойдет - что эти фичи на свой лад переизобретут инженеры BellSoft или Axiom JDK, но это будет не сразу.


  1. anonymous
    03.07.2023 04:42

    НЛО прилетело и опубликовало эту надпись здесь


  1. frankblackfrancis
    03.07.2023 04:42

    хороший дайджест, спасибо