Чашечка Java
8.36K subscribers
3.93K photos
13 videos
56 files
6.4K links
Лучшие материалы по Java на русском и английском

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels
Download Telegram
Maven разрешает зависимости: app → client → core:1.4 и app → adapter → bridge → core:2.0. Обе версии core имеют одинаковые groupId и artifactId; все зависимости — compile, управления версиями нет. Какая версия core попадёт в путь классов приложения?
Anonymous Quiz
24%
Только core:1.4
26%
Только core:2.0
35%
Обе версии core
16%
Сборка завершится ошибкой конфликта версий
👍2❤1
Чашечка Java
Maven разрешает зависимости: app → client → core:1.4 и app → adapter → bridge → core:2.0. Обе версии core имеют одинаковые groupId и artifactId; все зависимости — compile, управления версиями нет. Какая версия core попадёт в путь классов приложения?
Развёрнутое пояснение:

1. При построении дерева зависимостей Maven обнаруживает core:1.4 через client: от приложения до этой зависимости два перехода.

2. Через adapter и bridge обнаруживается core:2.0: до неё три перехода.

3. Поскольку groupId и artifactId совпадают, Maven рассматривает эти зависимости как две версии одного артефакта и разрешает конфликт по правилу ближайшей зависимости.

4. Путь до core:1.4 короче, поэтому в путь классов попадает только версия 1.4. Более высокий номер версии не даёт приоритета, а сам конфликт версий обычно не прерывает сборку.

Почему это важно

Задача проверяет разрешение транзитивных зависимостей Maven. При добавлении библиотеки приложение может получить более старую версию общего артефакта, чем ожидает другой компонент. Если ему нужны методы из версии 2.0, во время выполнения возможен NoSuchMethodError. Дерево зависимостей помогает обнаружить такой выбор, а управление версиями — задать согласованную версию явно.
👏1
JDK 28: простой API для чтения и создания JSON

Для JDK 28 интегрировали JEP 540: модуль jdk.incubator.json позволит работать с JSON без внешней библиотеки. Метод Json.parse() строит дерево JsonValue, по которому можно переходить через get() и извлекать значения нужного типа.

Такой API пригодится, например, для разбора ответа REST-сервиса или создания небольшого JSON-документа в утилите. Область задач ограничена: автоматического преобразования Java-объектов в JSON и потокового разбора в нём нет.

API находится в стадии инкубации, а JDK 28 доступен в ранних сборках. Для существующего приложения на Jackson переход потребует оценки того, какие возможности оно использует.

Описание и примеры JEP 540
JDK 28: маленькие аллокации Arena.ofConfined() станут дешевле

Для будущего JDK 28 подготовили оптимизацию FFM API: небольшие выделения нативной памяти в Arena.ofConfined() смогут обслуживаться из переиспользуемых пулов. По умолчанию кэш платформенного потока хранит до четырёх пулов по 64 байта.

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

Оптимизация работает и с виртуальными потоками: пул берётся у несущего потока и затем принадлежит арене. Переписывать вызовы API не требуется. Выигрыш в JMH измерен для маленьких аллокаций; ускорение всего приложения зависит от его нагрузки.

Устройство пулов и результаты замеров
👏1😁1
Spring Boot 4: настройка сервера авторизации и проверка токенов

Spring Authorization Server вошёл в Spring Security 7 и следует его циклу релизов. Он выдаёт клиентским приложениям токены доступа по OAuth 2.1 и поддерживает OpenID Connect 1.0 для идентификации пользователей.

В руководстве по настройке сервера показаны регистрация клиента через свойства приложения и проверка токенов в HTTP-клиенте IntelliJ. Authorization Code разбирается на примере входа пользователя с подтверждением разрешений. Client Credentials используется для обмена между приложениями без участия пользователя. Затем автор добавляет в JWT, токен с полями данных, список полномочий под именем aut.

Пример хранит пользователей в памяти. Для промышленной эксплуатации автор рекомендует внешний сервис управления пользователями и входом, например Keycloak или Okta.

#spring #java
Маршрутизатор запросов к моделям на Spring AI TypeSafe

Spring Boot 4.1.1 и стартер Spring AI TypeSafe 0.1.0: в туториале запрос сначала получает оценку сложности, затем направляется к выбранной модели. Приветствие и задача по проектированию архитектуры могут требовать разных моделей.

В разборе сборки маршрутизатора с нуля четыре уровня моделей описаны в enum. Jev, модель для структурированных решений, получает запрос и выбирает уровень по этим описаниям. Вместе с выбором возвращаются оценка уверенности и вероятности для каждого уровня: по ним можно смотреть, как изменения описаний влияют на решение.

Для маршрутизатора достаточно стартера. Без свойства spring.ai.typesafe.api-key он не создаст бин TypeSafeClient. Проект пока находится в Spring AI Community и не входит в основной репозиторий Spring AI.

#spring #java
Какими ИИ-ассистентами и агентами вы пользуетесь? Можно выбрать несколько
Anonymous Poll
9%
GitHub Copilot
1%
Codeium
47%
Claude Code
24%
Gemini
49%
ChatGPT
4%
GigaCode (Сбер)
3%
Yandex Code Assistant
29%
DeepSeek
5%
Hermes Agent
12%
Другое (напишу в комментариях)
Read. Write. Edit. Bash.

Это базовый набор операций Pi — агента, на котором построен OpenClaw. Дополнительные возможности появляются через расширения: агент может написать их по запросу пользователя, перезагрузить и проверить в работе.

У такого устройства есть полезные детали:
• состояние расширений хранится в сессии;
• беседу можно разветвить для отладки и вернуться с кратким пересказом;
• инструкции и примеры помогают агенту создавать новые функции.

Армин Ронахер разбирает Pi на собственных примерах: среди расширений, созданных по его запросам, есть список задач и ревью изменений кода. Получается взгляд на выбор ИИ-инструмента через то, что пользователь может настроить в нём под свою работу.

#ии #инструменты
Регистрация плагинов по списку через BeanRegistrar в Spring Framework 7

Spring Framework 7 и Spring Boot 4 позволяют программно регистрировать бины через BeanRegistrar. В руководстве по подключению плагинов разобран пример приложения, где набор плагинов задаётся списком в настройках.

Регистратор читает свойства app.plugins[0], app.plugins[1] и далее через Environment, пока не встретит отсутствующее значение. Затем сопоставляет имена плагинов с классами и регистрирует их через BeanRegistry. Подключение самого регистратора показано через @Import.

Автор отмечает, что для большинства случаев условной регистрации бинов, по его мнению, достаточно аннотаций семейства @ConditionalOn….

#spring #java
В Spring включён стандартный режим транзакций через прокси. Контроллер вызывает метод submit сервиса без активной транзакции. Метод submit без аннотаций вызывает публичный метод save того же объекта, помеченный @Transactional. Каковы границы транзакции сервиса?
Anonymous Quiz
30%
Транзакция охватывает только выполнение save
16%
Транзакция охватывает submit целиком
49%
Транзакция сервиса не открывается
6%
Вызов save завершается IllegalTransactionStateException
Чашечка Java
Развёрнутое пояснение:

1. Контроллер обращается к сервису через прокси Spring; активной транзакции в этот момент нет.

2. Для метода submit транзакционные настройки не заданы, поэтому прокси передаёт управление объекту сервиса без открытия транзакции.

3. Метод submit напрямую вызывает save у того же объекта. Такой вызов не проходит через прокси, который применяет транзакционные настройки.

4. Аннотация
@Transactional на save сама по себе не запускает транзакцию: в режиме прокси её должен обработать перехватчик Spring. Поэтому транзакция сервиса не открывается, а отсутствие транзакции само по себе не вызывает указанного исключения. Отдельные операции репозитория могут иметь собственные транзакционные границы.

Почему это важно

Задача проверяет понимание прокси и декларативного управления транзакциями Spring. При обработке заказа такой внутренний вызов может оставить несколько записей без общей транзакции: сбой поздней операции не обязательно отменит предыдущие. Если все операции submit должны быть атомарными, транзакционную границу можно задать на submit; если нужна отдельная граница для save, его можно вынести в другой сервис и вызывать через прокси.
Вызов диагностических команд JVM из Java без запуска jcmd

Каждый запуск jcmd создаёт новую JVM. Если вы встраиваете диагностику в собственный Java-инструмент, команды можно вызывать через JMX, встроенный механизм управления JVM.

В руководстве по вызову DiagnosticCommand разобрано подключение к работающей JVM через Attach API: запуск локального агента управления, получение MBeanServerConnection и вызов команды через invoke. Пример получает параметры JVM и команду запуска Java-приложения.

Имена команд нужно преобразовать: VM.command_line становится vmCommandLine. В статье есть функция преобразования и полный код вызова. Пример пока не поддерживает аргументы диагностических команд.

#java #jvm
👍1