Чашечка Java
Приветствуем вас на канале "Чашечка Java"! Здесь вы найдете лучшие материалы по Java на русском и английском языках. Мы предлагаем широкий спектр информации о Java, включая новости, статьи, учебные материалы и многое другое. Наш канал является идеальным местом для всех, кто интересуется этим языком программирования. Присоединяйтесь к нам и расширяйте свои знания в области Java!
Публикации канала
Gradle: сгенерированный checksum ещё нужно проверить Команда ./gradlew --write-verification-metadata sha256 собирает контрольные суммы зависимостей. Файл gradle/verification-metadata.xml затем служит базой для проверки загружаемых артефактов. При генерации этой базы Gradle доверяет тому, что уже доступно в репозиториях. Если JAR к этому моменту подменён, в базу попадёт checksum подменённого файла. Поэтому сгенерированные метаданные нужно проверить до принятия в проект. Checksum подтверждает совпадение с доверенной базой. Он не ищет вредоносный код и сам по себе не устанавливает автора. Changing-зависимости, включая SNAPSHOT, и локальные артефакты этой проверкой не покрываются. Руководство Gradle 9.7.0
Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥 ✅ 29 октября, четверг, 19:00 МСК — приходите на митап в Санкт-Петербурге или смотрите трансляцию. Спикеры из ЮMoney и Сбера выступят с докладами: 🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления. 🟣 Как я автоматизировал свой проект — и всё сломал Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей. 🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате. Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈
Spring: событие опубликовано, обработчик не вызван Событие опубликовано, исключений нет, а метод с @TransactionalEventListener не вызван. Сначала проверьте, была ли в момент публикации активная транзакция. По умолчанию обработчик привязан к AFTER_COMMIT. При откате он не сработает. Если транзакции вообще нет, Spring пропустит вызов. Атрибут fallbackExecution=true явно разрешает обработку и в этом случае. Здесь речь об обычной транзакции, привязанной к потоку. Выбор фазы связывает обработчик с её исходом, но не обеспечивает гарантированную доставку во внешнюю систему. Transaction-bound Events в Spring #spring #java
Bulkhead в Resilience4j: семафор или отдельный пул Если одна внешняя интеграция заняла все рабочие потоки, остальные запросы тоже могут застрять. Bulkhead позволяет ограничить число одновременных вызовов к выбранной зависимости. Но отдельный пул потоков появляется не в каждой реализации. SemaphoreBulkhead использует семафор и собственного пула не создаёт. В документации Resilience4j 2.2.0 у maxConcurrentCalls значение по умолчанию 25, у maxWaitDuration — 0. Первый параметр ограничивает одновременные выполнения, второй задаёт, сколько поток может ждать допуска, когда лимит исчерпан. У FixedThreadPoolBulkhead есть собственный пул и ограниченная очередь. Здесь нужно согласовать размеры пула и queueCapacity. У семафорного варианта размер рабочего пула остаётся вашей заботой. Такой лимит относится к конкурентным вызовам через конкретный bulkhead. Число запросов в секунду он не задаёт и пропускную способность внешнего сервиса не увеличивает.
Spring Boot: 20 секунд на фазу остановки В настройке spring.lifecycle.timeout-per-shutdown-phase=20s легко прочитать обещание «приложение завершится за 20 секунд». Но это таймаут отдельной фазы остановки, а не общий лимит завершения процесса. Значение 20 секунд приведено в документации как пример. Согласно справочнику Spring Boot 4.1.1, graceful shutdown включён по умолчанию для встроенных Jetty, Reactor Netty и Tomcat, в servlet- и reactive-приложениях. При закрытии контекста уже принятым HTTP-запросам дают время завершиться. Новые запросы эти серверы перестают принимать на сетевом уровне. При постоянных соединениях детали поведения могут отличаться. Есть ловушка при проверке из IDE: кнопка Stop может оборвать процесс сразу, если среда не отправляет корректный SIGTERM. Поэтому сначала проверьте, какой сигнал получает приложение. Иначе принудительное завершение легко принять за ошибку в настройке graceful shutdown.
Testcontainers: одного withReuse(true) мало Режим Reusable Containers оставляет контейнер работающим после тестов, чтобы следующий запуск мог использовать его снова. Но одного withReuse(true) в описании контейнера недостаточно. Нужно разрешить reuse и в окружении: через TESTCONTAINERS_REUSE_ENABLE=true либо запись testcontainers.reuse.enable=true в пользовательском ~/.testcontainers.properties. Файл свойств в classpath для этого не подходит. Контейнер запускают вручную через start(). Останавливать его нельзя ни прямым stop(), ни через try-with-resources или JUnit-интеграцию, которая завершит его за вас. При следующем запуске конфигурация должна совпадать. В руководстве Testcontainers режим помечен как экспериментальный и неподходящий для CI. Очистка ресурсов и сеть могут работать не полностью. А сохранённый контейнер с базой ещё не означает чистые данные перед новым тестом: это отдельная задача тестового окружения.
Java-расширение Oracle разделяет JDK языкового сервера и проекта Редактору может требоваться более новая Java, чем приложению. В Java Platform Extension от Oracle для VS Code эти настройки можно разделить. jdk.jdkhome задаёт JDK языкового сервера и используется для проекта по умолчанию. А jdk.project.jdkhome позволяет выбрать отдельный JDK для сборки и запуска проекта. Например, в настройках рабочего пространства: { "jdk.jdkhome": "/opt/jdk-27", "jdk.project.jdkhome": "/opt/jdk-21" } Пути замените на свои. Самому расширению нужен JDK 21 или новее, при этом поддерживаются проекты на JDK 8 и выше. Это пригодится, когда обновить инструменты уже можно, а приложение остаётся на прежней версии Java. Настройки Maven или Gradle при этом тоже нужно согласовать с выбранным JDK проекта. #java #vscode #jdk
Payara Community убирает требование повышенных прав для SSH-узлов В Payara Community 7.2026.10 управление SSH-узлами больше не требует повышенных прав. Для домена на нескольких хостах это упрощает настройку учётной записи, через которую сервер работает с удалённым узлом. SSH-доступ и необходимые разрешения остаются нужны. Изменение убирает требование избыточных привилегий. Ещё появились две команды asadmin для управления конфигурацией: delete-jvm-option и delete-system-properties. Исправлены проблемы с конкурентным развёртыванием и запуском приложений после перезапуска домена. Ветка Community 7 остаётся на Jakarta EE 11 и MicroProfile 7.1. В статье отдельно перечислены обновления коммерческих веток Azul Payara — их исправления и возможности нужно сверять со своей редакцией. #java #jakartaee #payara
Spring Tools 5.4 предлагает исправления для аннотаций контроллеров и тестов Некоторые сочетания аннотаций Spring можно выразить короче и точнее. В Spring Tools 5.4.0 добавили проверки и быстрые исправления для перехода к @RestController, @SpringJUnitConfig, @ApplicationModuleListener и специализированным аннотациям области видимости. Такие подсказки помогают замечать подходящие преобразования прямо в редакторе, не разыскивая каждое сочетание вручную. Команда также ускорила ряд быстрых исправлений и проверку версий по репозиториям, улучшила надёжность индексации исходников. Дистрибутив для Eclipse обновили до Eclipse 2026-09. Пригодится при поддержке существующего Spring-проекта: можно пройтись по диагностике и проверить предложенные изменения небольшими порциями. Применять их стоит с просмотром diff и запуском тестов. #java #spring #инструменты
Pi4J 5 позволяет подменять оборудование при разработке на обычном компьютере Код для GPIO и датчиков неудобно разрабатывать, если плата должна постоянно лежать рядом. В готовящейся Pi4J 5 добавили возможность использовать реальное оборудование, когда оно доступно, и переходить на заглушки на других системах. Это помогает проверять логику приложения на рабочем компьютере. Физические подключения, временные характеристики и поведение датчика всё равно нужно проверять на плате. Заодно команда упрощает API создания устройств: конфигурация собирается через newConfigBuilder() соответствующего типа, затем передаётся в context.create(...). Завершение работы тоже сводят к одному close(). Pi4J 5 пока находится в разработке, доступны snapshot-сборки. Дата финального релиза не объявлена, поэтому изменения API стоит учитывать до переноса рабочего проекта. #java #pi4j #iot
В JDK 28 готовят простой JSON API для небольших задач Прочитать JSON-конфигурацию, достать вложенное значение и сформировать небольшой документ — для таких случаев в JDK готовят собственный API разбора, навигации и генерации JSON. В докладе Everyday JSON in Java Алан Бейтман и Виктор Кланг объясняют, какие задачи он должен закрыть и как подход с ориентацией на данные повлиял на устройство API. Основной сценарий — простая работа с документом без подключения внешней библиотеки. Авторы отдельно подчёркивают: заменять существующие JSON-библиотеки целиком не планируют. Для проекта с настройками сериализации, модулями Jackson и преобразованием сложных объектных моделей появление нового API ещё не означает готовой замены. Для JDK 28 API готовится в статусе incubator. Интерфейс ещё может меняться; стабильной возможностью JDK 27 он не является. #java #json #jdk28
Helidon 27 переносит контекст с ThreadLocal на ScopedValue Идентификатор запроса и другие данные контекста нужны в разных слоях приложения. При передаче через ThreadLocal важно правильно задать и завершить их жизненный цикл. В Helidon 27 активный контекст фреймворка перенесли на ScopedValue. Значение привязано к ограниченной области выполнения, что помогает согласовать время жизни контекста с работой, для которой он нужен. Использовать более новые механизмы Java позволило повышение базовой версии: Helidon 27 требует JDK 27. Одновременно проект разделяет две линии развития. Helidon 27 — актуальная ветка с новыми возможностями, а Helidon 4.5 остаётся LTS-веткой для команд с более длинным циклом проверки и обновления. Поэтому переход стоит планировать вместе с обновлением JDK и проверкой зависимостей сервиса. #java #helidon #jvm
ИИ-ревьюер на Spring Boot превращает ответ модели в замечания к коду Отправить diff модели — только начало. Чтобы результат оказался полезен на ревью, нужно связать каждое замечание с файлом, местом в коде и объяснением проблемы. Автор CodeGuard AI описывает такой процесс на Java и Spring Boot: получить данные PR и изменения, собрать контекст, добавить правила проверки, разобрать ответ модели и подготовить ревью в GitHub. Замечания хранятся в структурированном виде: что найдено, где, насколько серьёзно и насколько уверена модель. Провайдер вынесен за отдельную абстракцию — можно переключаться между OpenAI, Gemini и Ollama. Полезная часть статьи — устройство всей цепочки вокруг модели. Структурированный ответ проще фильтровать и проверять, но оценка уверенности сама по себе не подтверждает, что найденная ошибка реальна. #java #springboot #codereview
Spring Batch отсекает несовместимые настройки builder ещё при компиляции Раньше некоторые взаимоисключающие настройки можно было записать в одной цепочке, а ошибку получить только на build(). В Spring Batch 6.1.0-M2 для нескольких builder-классов ввели поэтапный DSL. После выбора одной стратегии тип возвращаемого объекта ограничивает доступные следующие методы. Некорректную комбинацию теперь отвергает компилятор. Изменение затрагивает FlatFileItemReaderBuilder, FlatFileItemWriterBuilder и JdbcBatchItemWriterBuilder. При миграции проверьте код, который сохраняет промежуточный результат вызова в переменную с типом builder-класса: для него есть несовместимые изменения. Непрерывным цепочкам вызовов, по описанию команды, достаточно перекомпиляции. M2 — предварительная версия. Хороший повод проверить совместимость до финального релиза. #java #spring #batch
Gradle 9.8 использует настройки зеркал репозиториев из Maven В компании есть внутреннее зеркало зависимостей, а проекты собираются и Maven, и Gradle? В ветке Gradle 9.8 настройки зеркал можно брать из Maven вместо отдельного описания в каждой сборке. Включается в gradle.properties: org.gradle.mirror.maven.settings=true По умолчанию опция выключена. После включения Gradle заменяет адреса подходящих HTTP/HTTPS Maven-репозиториев по правилам зеркал. Это касается и репозиториев сборочных скриптов, и репозиториев в настройках и проектах. На Ivy, Maven Local, каталоги с JAR-файлами и репозитории через S3/GCS механизм не распространяется. При обновлении выбирайте патч 9.8.1: он исправляет уязвимости и регрессии первоначального релиза. #java #gradle
Java-сервер с генерацией зависимостей при сборке Маршруты HTTP и создание компонентов можно подготовить до запуска приложения. В разборе Codename One Backend показано, как аннотации превращаются в обычные Java-классы для маршрутизации и внедрения зависимостей. Сгенерированный код создаёт объекты прямыми вызовами конструкторов. Отсутствующие зависимости, неоднозначный выбор компонента и циклы конструкторов приводят к ошибке сборки. Затем ParparVM переводит байткод в C для нативной компиляции. Названия аннотаций напоминают Spring, но находятся в собственном пакете com.codename1.backend.annotations. Это отдельный развивающийся проект со своим набором возможностей. В статье есть сравнение старта и памяти с Spring Boot, однако замеры сделаны на двух простых HTTP-обработчиках без базы, TLS и авторизации. Интереснее начать с устройства сгенерированного кода, а показатели своего сервиса проверить с его реальными зависимостями. #java #производительность
Spring AI: похожий документ ещё не содержит ответа Векторный поиск нашёл текст по теме, но в ответ модели снова попала справочная информация вместо нужного факта. Для такого случая в примере Spring AI Modular RAG поиск разделён на несколько этапов. Сначала модель переписывает вопрос для поиска и создаёт несколько его вариантов. Найденные фрагменты объединяются, после чего JevDocumentFilter отсеивает неподходящие, а JevDocumentReranker меняет порядок и оставляет лучшие. Компоненты реализуют интерфейс DocumentPostProcessor и подключаются к RetrievalAugmentationAdvisor. Их можно менять отдельно от хранилища и модели, которая формирует ответ. Есть полезная деталь: фильтрация и формирование контекста используют исходный вопрос пользователя. Переписанный запрос нужен только для поиска. В статье рядом лежат простая и модульная версии примера — удобно сравнить, какие фрагменты дошли до модели и почему часть была исключена. #spring #java #rag
Quarkus 4: что проверить перед миграцией Первая бета Quarkus 4 меняет базовые зависимости сразу в нескольких частях приложения. Минимальная версия Java теперь 21, сетевой стек переходит на Netty 4.2 и Vert.x 5. В обзоре команды также перечислены Hibernate ORM 8, Jackson 3, CDI 5.0 и Jakarta REST 4. Поэтому обновление стоит начинать с проверки расширений, сериализации и работы с базой. Для перехода подготовлено отдельное руководство. Из новых возможностей — HTTP/3, который включается явно, и Observation API: аннотация @Observed или программный интерфейс создают метрики и трассировки через Micrometer и OpenTelemetry. В Dev UI появилась встроенная панель наблюдения. Релиз пока тестовый. Команда просит разработчиков расширений проверять совместимость, а пользователей — прогонять приложения и сообщать о проблемах. Хорошая задача для отдельной ветки: пройти миграцию и посмотреть на поведение интеграционных тестов. #java #quarkus
Как HotSpot ускоряет криптографию внутри JDK Реализация алгоритма написана на Java, но некоторые часто выполняемые операции JVM может заменить машинным кодом под конкретный процессор. Такой механизм называется intrinsic. В статье команды Java он разобран на постквантовых ML-KEM, ML-DSA и HSS/LMS. У первых двух много повторяющихся операций с коэффициентами полиномов — подходящая работа для векторных инструкций. Проверка подписей HSS/LMS выигрывает от ускорения SHA-256. Аннотация @IntrinsicCandidate отмечает методы, для которых HotSpot может применить такую замену. Java-реализация остаётся запасным вариантом, если подходящего ускорения на платформе нет. В статье приведены замеры JDK 28 на Linux/AArch64. Они сравнивают отдельные алгоритмы с включёнными intrinsics и без них. При оценке результата важны набор параметров алгоритма и возможности CPU: ускорение криптографической операции само по себе не определяет скорость всего сервиса. #java #jvm
Hibernate 8: проверки версий при конкурентных обновлениях Оптимистическая блокировка должна обнаружить, что между чтением и записью сущность уже изменил другой запрос. Детали реализации и поведение базы здесь имеют значение. В разборе изменений Hibernate 8 Beta2 команда описывает усиленные проверки версий: они учитывают ситуации, в которых конкурентное изменение раньше могло остаться незамеченным. Поддержку блокировки по версии получили StatelessSession и EntityAgent из Jakarta Persistence. Ещё одно изменение касается параллельных upsert в StatelessSession: обработка учитывает гонку вставки. Для разделения данных по арендаторам их идентификаторы последовательно включаются в SQL изменения данных. Это повод добавить к проверке миграции сценарии с одновременными обновлениями и вставками. Ветка Hibernate 8 пока тестовая; после описанной Beta2 уже вышла Beta3. Возможности из заметки полезно оценивать вместе с актуальным руководством по миграции. #java #hibernate
Комментарии
Комментариев пока нет
Комментарии пишут вошедшие — так видно, кто автор.
Войти