Библиотека Java разработчика
10.3K subscribers
1.06K photos
595 videos
58 files
1.46K links
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.


По всем вопросам @evgenycarter

РКН clck.ru/3KoGeP
Download Telegram
Совет Spring Framework💡

Вы можете инжектировать (autowire) бины, которые могут отсутствовать, обернув их в java.util.Optional. Таким образом вы сообщаете, что этот бин является необязательным, избегаете исключения, если он не существует, и можете аккуратно обработать его отсутствие с помощью Optional API.

📲 Мы в MAX

👉@BookJava
👍43
👩‍💻 Java в Kubernetes за 40 минут: как задеплоить приложение в Minikube

Приглашаем на открытый урок.

🗓 08 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java разработчик. Экспертный уровень».

Minikube — личный Kubernetes для тестов. Научитесь деплоить Java-приложения — база для DevOps, CI/CD и продакшна.

О чем поговорим:

✔️ Подготовка Java-приложения к деплою (JAR → Docker image).
✔️ Установка Minikube и настройка локального кластера.
✔️ Написание манифестов: Deployment, Service, ConfigMap.
✔️ Запуск приложения и проверка работоспособности.

Вебинар будет полезен:
Java-разработчикам, начинающим осваивать Kubernetes и DevOps-подходы, а также инженерам, выстраивающим локальные CI/CD практики.

В результате вебинара:
Сможете самостоятельно задеплоить Java-приложение в Minikube, написать манифесты и лучше понять, как работает Kubernetes «под капотом».

🔗 Ссылка на регистрацию: https://vk.cc/cYtfHW

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
🔧 Как ускорить сборку Maven проекта в 3 раза

Сегодня покажу пару приёмов, которые помогут тебе значительно ускорить сборку Maven проекта. Особенно полезно, если ты работаешь с большими монолитами или частыми CI/CD прогонками.

🚀 1. Включи параллельную сборку

Добавь флаг -T (thread count), чтобы Maven собирал модули параллельно:


mvn clean install -T 1C


1C — это количество потоков = количеству ядер CPU. Можешь указать, например, -T 4 для 4 потоков. Эффект — сборка может стать в 2–4 раза быстрее.

🧹 2. Пропускай тесты, если они не нужны

Когда работаешь над UI, версткой или конфигурацией:


mvn clean install -DskipTests


⚠️ -DskipTests — пропускает *и* компиляцию тестов, и сами тесты.
Если хочешь только не запускать тесты, используй:


mvn clean install -Dmaven.test.skip=false -DskipTests=true


📦 3. Используй mvn dependency:go-offline

Это скачает все зависимости, плагины и сделает тебя независимым от интернета:


mvn dependency:go-offline


Полезно для CI и работы в поезде ✈️


📲 Мы в MAX

👉@BookJava
👍4
🧵 Как правильно логировать ошибки в Java-приложении

Привет, друзья! Сегодня я расскажу о простой, но критически важной теме — логирование ошибок. Часто вижу, как разработчики либо совсем не логируют исключения, либо делают это неправильно. В итоге: баг есть, а откуда он взялся — непонятно.

Вот пара реальных примеров:

Плохо:

try {
doSomething();
} catch (Exception e) {
System.out.println("Error happened");
}


Хорошо:

private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

try {
doSomething();
} catch (Exception e) {
logger.error("Failed to do something", e);
}


💡 Почему это важно:
- logger.error позволяет видеть стек исключения, а это ключ к диагностике.
- Можно использовать logger.warn или logger.info в зависимости от уровня важности.
- Хороший лог помогает быстро локализовать проблему на проде без дебага.

🎯 Совет:
Используйте Slf4j в связке с Logback или Log4j2. И обязательно следите за форматом логов — например, логируйте traceId, userId, requestId и другие полезные метаданные.

А вы как логируете ошибки у себя в проекте? Делаете свою обёртку? Используете AOP?

📲 Мы в MAX

👉@BookJava
👍31🔥1
👩‍💻 Контейнеризация Java-приложений с Docker

Приглашаем на открытый урок.

🗓 22 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java разработчик. Экспертный уровень».

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


На занятии мы разберем:
✔️ Что такое Docker-контейнер и зачем он нужен разработчику?
✔️ Как развернуть и запустить Java-приложение в Docker-контейнере?
✔️ Основы профилирования и отладки приложений внутри Docker-контейнера.

Урок будет полезен тем, кто хочет:
- Освоить навыки работы с Docker-контейнерами.
- Узнать, как контейнеризация помогает в разработке и развертывании приложений.
- Получить практические знания по запуску, тестированию и профилированию Java-приложений в Docker.

🔗 Ссылка на регистрацию: https://vk.cc/cYD933

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Collection vs List в Java: в чём разница и когда что использовать

Сегодня разберёмся с одним из самых популярных вопросов у джавистов: чем отличается Collection от List и когда что применять.


🔹 Collection — это базовый интерфейс всех коллекций в Java. Он описывает общие операции:
add(), remove(), size(), contains() и т.д.

🔹 List — это подинтерфейс Collection, предназначенный для работы с упорядоченными списками.
Дополнительно даёт методы:
get(index), set(index, value), indexOf(), add(index, value).


🔧 Пример с Collection:

Collection<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");

for (String name : names) {
System.out.println(name);
}


Здесь важно только наличие элементов — порядок и индексы не важны.


🔧 Пример с List:

List<String> cities = new ArrayList<>();
cities.add("Moscow");
cities.add("Berlin");
cities.add(1, "Paris");

System.out.println(cities.get(1)); // Paris


В этом случае нужен порядок и доступ по индексу — значит, выбираем List.


📌 Когда использовать что:

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

🧠 Совет:
При проектировании методов или API лучше принимать Collection — так ты не ограничиваешь пользователя в реализации.
А если внутри метода тебе нужны индексы — переходи на List.

📲 Мы в MAX

👉@BookJava
👍41
💡Совет: @TransactionalEventListener — это специализированная версия @EventListener, которая прослушивает событие и ждёт завершения текущей транзакции, прежде чем сработать.
Ожидание согласованного состояния базы данных позволяет безопаснее реагировать на изменения, внесённые в БД

📲 Мы в MAX

👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4
Сегодня я покажу вам простой, но мощный приём, который помогает упростить работу с коллекциями в Java — Collectors.collectingAndThen.

Если вы когда-нибудь писали что-то вроде:


List<String> list = someStream
.collect(Collectors.toList());
return Collections.unmodifiableList(list);


то collectingAndThen сделает это в одну строку:


List<String> list = someStream.collect(
Collectors.collectingAndThen(
Collectors.toList(),
Collections::unmodifiableList
)
);


Где это может пригодиться?

– Возвращаете коллекцию из метода и не хотите, чтобы кто-то её изменял
– Хотите обернуть результат в Optional, Set, Map, EnumMap и т.д.
– Нужно после сбора в Stream ещё что-то сделать над результатом (например, отсортировать, фильтровать, обернуть)

Ещё пример:


Optional<String> maxName = people.stream()
.map(Person::getName)
.collect(Collectors.collectingAndThen(
Collectors.maxBy(Comparator.naturalOrder()),
Optional::ofNullable
));


Этот метод часто остаётся в тени, но он может существенно упростить код и сделать его чище. Попробуйте использовать его в своём проекте 😉

📲 Мы в MAX

👉@BookJava
👍4👎1🔥1
🔥 Приглашаем на бесплатный открытый вебинар курса «Высоконагруженные системы: архитектура и масштабирование»:

«Асинхронная обработка данных в высоконагруженных системах»

🗓 Когда: 16 июня, 20:00 (мск)

На вебинаре разберём, как грамотно внедрять асинхронность и строить по-настоящему производительные системы.

Что будет на вебинаре:
— Зачем и когда переходить на асинхронную обработку данных в высоконагруженных проектах
— Очереди сообщений, веб-сокеты и другие инструменты асинхронного взаимодействия
— Реальный архитектурный кейс: от веб-сервера до брокера сообщений и базы данных
— Типичные узкие места асинхронных систем и проверенные способы их устранения

👉 Зарегистрироваться: https://vk.cc/cYLGN5

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

🎁При покупке курса вы получите в подарок мини-курс по Kafka, который поможет подготовиться к собеседованию в бигтех

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍1
🔐 Bouncy Castle: Легендарная криптография для Java

Если вы разрабатываете на Java и вам нужно работать с шифрованием на серьезном уровне, этот репозиторий - абсолютный мастхэв. Официальный репозиторий проекта Bouncy Castle (bc-java) - это настоящий швейцарский нож для любых криптографических задач.

Стандартной реализации JCA/JCE (Java Cryptography Architecture / Extension) часто не хватает для сложных или специфических сценариев. Bouncy Castle блестяще решает эту проблему, предлагая как низкоуровневый (lightweight) криптографический API, так и полнофункциональный провайдер для JCE.

🛠 Главные возможности библиотеки:

Огромный выбор алгоритмов: От классических RSA, AES и ECC до различных национальных стандартов (включая ГОСТы) и экзотических шифров.
Постквантовая криптография (PQC): Библиотека идет в ногу со временем и активно внедряет постквантовые алгоритмы, устойчивые к будущим атакам с использованием квантовых компьютеров.
Инфраструктура открытых ключей (PKI): Мощнейшие и очень удобные API для генерации и обработки X.509 сертификатов, CRL, а также работа со стандартами CMS, S/MIME, OpenPGP, TSP, CMP, CRMF и OCSP.
Поддержка TLS/DTLS: Собственный независимый API для работы с защищенными сетевыми протоколами (вплоть до TLS 1.3).
Независимость от версии Java: Bouncy Castle поддерживает широкий спектр версий JVM, начиная с весьма старых (J2SE 1.5+) и заканчивая самыми современными.

💡 Когда это нужно?
Bouncy Castle выручает там, где пасуют стандартные средства JDK. Нужно сгенерировать сложный сертификат «на лету», распарсить зашифрованное PGP-сообщение, использовать нестандартную эллиптическую кривую или реализовать защищенный протокол без привязки к конкретной ОС? Для всего этого используется Bouncy Castle.

https://github.com/bcgit/bc-java

📲 Мы в MAX

👉@BookJava
👍31🔥1
🧪 Зачем Java-разработчику тестировать логику в SQL?

Сегодня покажу вам полезный трюк для тех, кто пишет сложные запросы в PostgreSQL (или любом другом SQL-движке) и хочет их тестировать ещё до интеграции в Java-приложение.

Если у тебя в проекте сложная логика в JOIN, CASE, оконных функциях или CTE — протестируй это на стороне базы, как обычную функцию.

🔹 Создаём функцию в PostgreSQL:

CREATE OR REPLACE FUNCTION test_discount(user_id INT)
RETURNS NUMERIC AS $$
BEGIN
RETURN (
SELECT
CASE
WHEN u.vip = true THEN 0.2
ELSE 0.05
END
FROM users u WHERE u.id = user_id
);
END;
$$ LANGUAGE plpgsql;


🔹 Проверяем прямо в базе:

SELECT test_discount(101); -- вернёт 0.2 или 0.05


Это удобно, когда:
- Ты хочешь протестировать ветки логики без запуска всего приложения;
- У тебя CI/CD запускает SQL-тесты отдельно (через pgTAP, например);
- Ты хочешь быстро показать запрос аналитику или тимлиду без Java-контекста.

💡 Лайфхак: если ты используешь Liquibase/Flyway — можно держать такие функции прямо в changelog'ах как test-only objects, не влияя на runtime-приложение.

Попробуй — экономит массу времени на ревью и отладке запросов!

📲 Мы в MAX

👉@BookJava
🔥2👍1👎1