Обновить
128K+

Java *

Объектно-ориентированный язык программирования

110,67
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

«Щелчок Таноса» или искусство в разработке

Уровень сложностиСложный
Время на прочтение6 мин
Охват и читатели7.4K

Ресурсы Вселенной ограничены, а постоянно растущее население планеты может привести к голодному вымиранию всего человечества в ближайшем будущем. Чтобы спасти людей от голодного вымирания, киновселенная Marvel придумала оригинальный способ решения проблемы. Создав могущественного титана по имени Танос, взявшего на себя миссию спасителя. Идея Таноса состояла в том, чтобы собрав шесть Камней Бесконечности и объединив их силу в специальной Перчатке, раз и навсегда избавиться от половины населения планеты, просто щелкнув пальцами.

Эта история породила метафорическое значение, а фраза "Щелчок Таноса" стала крылатой и приобрела вполне реальные события. К примеру в бизнесе такое действие иронично называют жесткими антикризисными мерами, когда руководство компании одним махом увольняет большое количество сотрудников, дабы спастись от банкротства.

В этой статье я расскажу как можно реализовать сложные графические эффекты при разработке мобильных приложений.

Читать далее

Новости

Модульная надстройка для JasperReports: подключение и что делает процессор при сборке. Часть 3

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели9.2K

Третья часть серии — практическая. Как подключить библиотеку к Maven-проекту, написать первый модульный отчёт и что после этого происходит с шаблоном при сборке.

Субрепорт — это класс, отчёт — тоже класс, а поля класса и есть содержимое отчёта. Имена параметров шаблона берутся из имён полей, поэтому один и тот же модуль можно поставить в отчёт дважды и получить два независимых субрепорта со своими данными. Аннотационный процессор при компиляции находит существующий JRXML, дописывает в него недостающие параметры, датасеты и банды субрепортов и кладёт результат в target/generated-sources. Шаблон в src он не трогает никогда.

Отдельно — про то, кто владеет шаблоном, когда в один файл пишут и кодогенератор, и человек в Jaspersoft Studio, и где у этой схемы слабое место.

Первая часть — откуда взялся Jasper и почему он так устроен, вторая — один стандарт и три идеи.

Читать далее

Модульная надстройка для JasperReports: один стандарт и три идеи. Часть 2

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели7.6K

Во второй части серии — чего ждёт от инструмента отчётов современный Java-разработчик и на каких идеях я собрал свою надстройку над JasperReports — не переписывая движок и не отказываясь от Jaspersoft Studio.

Один стандарт вместо нескольких способов передать данные: в отчёт едут обычные Java-объекты. Дерево вместо плоской сетки банд: отчёт собирается из модулей, вложенных друг в друга, включая повторяющиеся. Слои: данные добывает Java, вёрстка остаётся в JRXML и в Studio. И объект как единый носитель структуры, данных и имён — вместо одного и того же смысла, продублированного и в XML, и в коде.

Отдельно — ответ на возражение из комментариев к первой статье: зачем вообще выносить выборку данных из шаблона, если Jasper умеет ходить в базу сам.

Первая часть серии — откуда взялся Jasper и почему он так устроен.

Читать далее

Модульная надстройка для JasperReports: откуда взялся Jasper и почему он так устроен. Часть 1

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели7K

JasperReports появился в самом начале нулевых: румынский разработчик Теодор Данчу делал большой Java-проект, где нужно было формировать и печатать много сложных документов, а готовые решения оказались проекту не по карману. Прошло двадцать пять лет, движок жив и широко используется, а работают с ним примерно так же, как тогда. И на это есть причины, которые лежат в его происхождении.

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

Это не критика. Ядро у Jasper мощное, просто он наследник другой традиции — той, где отчёт является самостоятельным приложением, а не частью вашего.

Читать далее

Один код на Paper и Velocity: как устроены multiloader-плагины в 2026

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели5.7K

Один код — и Paper-сервер, и Velocity-прокси: разбираем, как устроены multiloader-плагины для Minecraft и чем они питаются в 2026 году — от архитектуры до сборки.

Узнать о Multi Loader

Retry policy на практике: подводные камни внедрения

Уровень сложностиСредний
Время на прочтение19 мин
Охват и читатели6.8K

Что делать, если произошла ошибка? Житейская мудрость говорит, что можно попробовать еще раз. 

В контексте разработки ПО существует известный и простой паттерн для повышения отказоустойчивости — retry.

Реализация ретраев в Java-приложениях придумана давно. Как вариант — достаточно добавить в код стандартные аннотации. Но внедрить ретраи — это не так просто, как кажется: нужно решить еще много вопросов — например, как сохранить согласованность данных, как подружить ретраи на разных уровнях архитектуры, а еще учесть особенности разных технологий. И наконец, как при этом не навредить проекту.

Привет! Меня зовут Петр Деменев, я Java-разработчик в MTC Web Services. В материале расскажу о нашем горьком, но успешном опыте внедрения политики ретраев в реальный проект и о неочевидных особенностях, с которыми мы столкнулись. В тексте будет акцент не на строгих теоретических канонах, а на реальной жизни, чтобы приземлиться на уровень практического опыта. И попутно расскажу о некоторых способах ретрая.

Читать далее

Отцы и дети. Java и Go

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели12K

Не война двух языков (хоть и бывает), не разные идиомы и взгляды на реализацию делают инструмент “плохим”, а по классике - забивание гвоздей молотком и карго-культ

Читать далее

Трагедия версионирования ПО

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели11K

As we say, two of the most complicated problems in software are naming things and versioning software

Когда-то в кулуарах Devoxx Belgium нечто подобное сказал Томас Вюртингер, лид проекта GraalVM, поясняя детали вот этой нашумевшей статьи. Это не точная цитата, а лишь фраза, призванная обратить внимание на проблему. О ней сегодня мы и поговорим.

Всем привет! Меня зовут Михаил Поливаха, я являюсь техническим лидером Open Source проекта Axelix.

Довольно давно я хотел написать небольшую статью про версионирование ПО в целом, поскольку, как мне кажется, этой теме незаслуженно достаётся мало внимания. Для многих версионирование заканчивается на SemVer, но тема гораздо, гораздо более обширна, чем может показаться.

Читать далее

Базовые принципы ООП и SOLID

Уровень сложностиПростой
Время на прочтение26 мин
Охват и читатели8.4K

Данная статья служит двум целям, быстро освежить знания по ООП и SOLID, а также полезно и весело проектировать роботов с элементами игры средствами языка Java.

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

Читать далее

Final должен быть final

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели6.5K

В JDK 26 есть JEP 500 — Prepare to Make Final Mean Final. Теперь JVM предупреждает о попытках изменить через deep reflection final-поле объекта, не объявленное как static. В одном из будущих релизов такие операции планируется запрещать, если владелец приложения не разрешил их явно. В статье разберём:

Читать далее

Как сделать 2D-игру на LibGDX живее: 5 простых приёмов

Уровень сложностиСредний
Время на прочтение19 мин
Охват и читатели12K

В предыдущей статье я писал про [5 вещей, которые не следует делать в LibGDX].

Поэтому логично продолжить тему и поговорить о вещах, которые, наоборот, стоит использовать при разработке 2D-игры на LibGDX.

Сразу оговорюсь: это не статья про архитектуру, паттерны проектирования, ECS, оптимизацию кода или правильную организацию проекта.

Здесь всё гораздо проще.

Я хочу поговорить о нескольких технических инструментах, которые способны относительно небольшими усилиями заметно улучшить визуальное восприятие игры:

Читать далее

Персональные инструменты как пет-проект

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели8.8K

Код как хобби за 15 лет в индустрии оставил за собой кладбище пет-проектов. В этот раз Java-оркестратор: git worktree, CLI-сессии, merge request и дашборд для работы. Хроника того, как рос личный инструмент и как на этом кейсе я переосмыслил привычную инженерию.

Читать далее

SQL‑инъекция через декомпиляцию: от JAR‑файла до захвата пароля

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели8.4K

SQL‑инъекция через декомпиляцию: от JAR‑файла до захвата пароля

Материал носит образовательный характер. Все работы велись легально, в рамках пентеста, с письменного согласия владельца системы и в изолированном контуре. Название клиента и продукта не раскрываем — NDA. Имена классов, пакетов и таблиц в листингах изменены. Применяйте это только на системах, доступ к которым у вас есть. Доступ к чужим системам без разрешения преследуется по закону.

Корпоративная Java‑система: складской учет, веб‑интерфейс, HTTPS. Внутри — SQL‑инъекция без аутентификации в одном GET‑запросе, из‑за строки «... WHERE ID=» + параметр.

Разберем, как найти такую в приложении без исходников: декомпиляция JAR → чтение сервлетов → уязвимая строка → подтверждение через pg_sleep. Каждый шаг воспроизводим.

Читать далее

Ближайшие события

Новые фичи Java нужны не только на собеседованиях

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели12K

Всем привет! На связи Михаил Поливаха, технический лидер проекта Axelix.

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

И это, кстати, не обязательно плохо. Тащить новую фичу в production только потому, что она новая, не самая выдающаяся инженерная стратегия. Более того, многие приложения всё ещё работают на Java 17, а где-то бодро живёт и Java 11.

Но отсюда возникает закономерный вопрос:

Есть ли у новых возможностей Java применение в обычных, реальных приложениях? Не в презентации, не в игрушечном pet project, а в коде, который решает вполне конкретную задачу?

Да, есть.

Читать далее

ИИ‑фабрика: переход к автономной разработке

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели8.2K

Что делать, когда процесс разработки с ИИ-агентами уже устоялся, но всё ещё приходиться сидеть рядом с ними и ждать, когда они закончат очередной этап работы, чтобы запустить следующий?

У меня это выглядит так. Появилась идея новой фичи для разработки. Я запускаю /opsx:explore скил OpenSpec и обсуждаю с ИИ как будем делать эту фичу, какие нюансы и детали надо предусмотреть. Когда открытых вопросов не остаётся, перехожу к /opsx:propose, чтобы подготовить спецификации перед разработкой. Потом ревью спек с помощью команды /review-artifacts и правка найденных нестыковок. Дальше запускаю /opsx:apply-sequential для реализации в автономном режиме и чистым контекстом агента для каждой подзадачи. Потом ревью через /audit-implementation и правки после него. Архивирование изменения через /opsx:archive. И наконец-то создание PR, финальное ревью и merge.

И так раз за разом! На простых задачах моё участие сводится к запуску команд и подтверждению предложенных решений. На задачах посложнее отвечаю на вопросы наподобие какую из альтернатив выберем. Хотя этот выбор можно сделать по критериям, зафиксированным в проекте. И это уже начинает утомлять. Пришло время автоматизировать и эту рутину. Так я начал делать свою фабрику, где ИИ-агенты («гномы») трудятся в полностью автономном режиме. А к человеку обращаются только тогда, когда столкнулись с проблемой, которую не могут решить сами.

Как фабрика устроена внутри

Нововведения Java 27

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели6.8K

Java 27 вышла в релиз. В него вошли четыре узконаправленные правки и пять превью/инкубаторов. Разбираем изменения в сборщике мусора, улучшения JFR, постквантовый TLS 1.3 и компактные заголовки объектов, экономящие треть памяти.

Читать далее

Вышла Java 27

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели18K

🔥 Выходит Java 27!

• Compact Object Headers включаются по умолчанию. Метаданные каждого объекта становятся компактнее, что может уменьшить потребление heap примерно на 20% и снизить нагрузку на GC. Раньше для этого требовался флаг -XX:+UseCompactObjectHeaders.

• G1 становится сборщиком мусора по умолчанию во всех окружениях. Раньше JVM могла выбирать Serial GC на машинах и в контейнерах с небольшим количеством ресурсов. Поэтому после обновления стоит перепроверить память, паузы и CPU именно на маленьких инстансах.

• JFR начинает автоматически скрывать чувствительные данные. Пароли, токены, API-ключи и секреты в аргументах JVM, переменных окружения и системных свойствах больше не должны случайно попадать в запись Flight Recorder.

Читать далее

Java 27: Новый день или Обзор JEP JDK 27

Время на прочтение16 мин
Охват и читатели6.4K

Уже завтра ожидается выход JDK 27, в которую вошли 9 JEP, связанных с криптографией, диагностическим механизмом JFR, управлением памятью и стандартной библиотекой. В этой статье разберём, что нас ждёт в этом релизе Java.

Читать далее

Плагин Profiling Tools для исследования Java‑приложения в OpenIDE

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели11K

Иногда Java-приложение ведёт себя странно: потребляет больше памяти, чем ожидалось, тормозит без видимой причины или будто «ничего не делает», хотя запросы всё равно обрабатываются медленно. В такие моменты хочется быстро посмотреть «внутрь» Java-приложения, например, сколько памяти оно потребляет, какие потоки в нём запущены и что с ними происходит.

Первое, что приходит в голову, это VisualVM или JDK Mission Control. Однако во время разработки приложения удобнее не переключаться между инструментами, а открыть состояние процесса прямо в IDE.

Для этого мы в OpenIDE выпустили Profiling Tools — плагин для мониторинга и исследования Java-приложений. Его разработкой занималась команда Axiom JDK.

В этой статье разберём, что из себя представляет Profiling Tools и как с его помощью можно быстро и удобно разобраться что не так с приложением.

Читать далее

HikariCP в проде: три раза, когда пул соединений уронил сервис, и почему maximumPoolSize тут был ни при чём

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.4K

В прошлой статье про PostgreSQL я разбирал три инцидента на стороне базы — блокировки, bloat и ночные пересчёты. В комментариях несколько человек написали примерно одно и то же: «база базой, а покажи, что творилось на стороне приложения — пул-то небось тоже горел».

Горел. Ещё как.

Это продолжение того же разбора, но на слой выше — про HikariCP, дефолтный пул соединений в Spring Boot. Тот самый, который «просто работает», пока не перестаёт. Проекты те же, что и в статье про миграцию и в статье про PostgreSQL: банковская система после переезда с Oracle (терабайт, 70+ таблиц, 500–3000 RPS на чтение и 50–300 на запись в пике) и enterprise-платформа на Java/Spring, где PostgreSQL жил под Hibernate. Разные команды, разные нагрузки, но сюжет один: сервис встаёт, в логах Connection is not available, и первое, что делает любой человек, — лезет крутить maximumPoolSize. И почти всегда делает хуже.

Это не туториал «как настроить HikariCP за 10 строк». Таких на Хабре хватает, и половина из них сводится к «поставьте пул побольше». Здесь — список мест, где у нас всё ломалось, в порядке от «это все знают, но всё равно наступают» до «поняли только в проде под нагрузкой».

Если вы сейчас живёте на HikariCP — читайте как чеклист. Если уже прошли через это — сверьте, сколько совпало.

Дисклеймер: проекты под NDA, названия, точные объёмы и часть деталей изменены. Порядок величин, конфиги и сами инциденты — настоящие.

Читать далее
1
23 ...