Всем привет!
Небольшой опрос - устраивает ли Вас, что публикуется на канале? Не собираетесь ли вы уходить?
Небольшой опрос - устраивает ли Вас, что публикуется на канале? Не собираетесь ли вы уходить?
Anonymous Poll
59%
Да, вполне, спасибо за контент! 🙂
16%
В целом да, но многое мне еще непонятно 🤷♀️
3%
В целом да, но я это все уже знаю, хочется чего-то более сложного ✌️
3%
Наверно устраивает. Не уверен. 🧼
0%
Я ничего не понимаю и наверное уйду, пожалуй... 👎
6%
Я читаю канал редко, но в целом уходить не собираюсь, все устраивает. 🏝
0%
У меня есть предложение добавить чего не хватает - я напишу в комментариях 🧑💻
13%
Я есть Грут 🗿
Архитектура Maven и философия Convention over Configuration
После первого знакомства с Maven важно не просто уметь пользоваться им, а понимать его архитектуру, принципы работы и идеологию. Это особенно критично для тех, кто хочет углубиться в автоматизацию, CI/CD и масштабирование проектов с помощью Maven.
Maven как декларативная модель
Maven основан на декларативной модели сборки: вы описываете, что должно быть сделано, а не как. Это противоположность императивным сборочным системам вроде Ant, где разработчик пишет шаг за шагом скрипты сборки. В Maven центром управления является файл pom.xml — он описывает структуру проекта, зависимости, плагины, цели сборки и метаинформацию.
Архитектура Maven
Архитектура Maven построена вокруг трёх ключевых сущностей:
1. POM (Project Object Model)
POM — сердце проекта. В нем описано всё: от координат артефакта (groupId, artifactId, version) до зависимостей, плагинов, профилей и модулей. POM определяет не только поведение сборки, но и организацию кода, стратегию управления версиями и способы расширения функциональности проекта.
2. Репозитории
Система Maven разделяет репозитории на три уровня:
Локальный (~/.m2/repository) — кеш библиотек и плагинов, уже использованных разработчиком
Центральный (Maven Central) — основной публичный репозиторий.
Удалённые (корпоративные) — приватные хранилища (Nexus, Artifactory и др.).
При разрешении зависимостей Maven сначала ищет артефакт в локальном репозитории, затем — в удалённых.
3. Плагины и цели (goals)
Maven сам по себе — движок исполнения, не знающий, как компилировать, тестировать или архивировать проект. Всё это делают плагины, привязанные к жизненному циклу. Например, maven-compiler-plugin отвечает за компиляцию, а maven-surefire-plugin — за запуск тестов. Каждый плагин состоит из целей (goals), которые выполняются в рамках фаз сборки.
Жизненный цикл сборки
Основой выполнения в Maven является жизненный цикл сборки (Build Lifecycle) — предопределённая последовательность фаз.
Есть три основных цикла:
default — основной, включает: compile, test, package, install, deploy.
clean — очищает артефакты: pre-clean, clean, post-clean.
site — генерирует документацию: site, site-deploy.
Maven всегда выполняет все фазы до указанной. То есть mvn install запустит validate, compile, test, package, verify, install.
Convention over Configuration
Одной из ключевых идей Maven является принцип «Конвенция важнее конфигурации» (Convention over Configuration):
Maven ожидает, что структура проекта будет стандартной:
Артефакт будет упакован как jar (если не указано иное).
Папки ресурсов и тестов тоже стандартны.
Это означает, что вам не нужно конфигурировать то, что уже стандартизировано. Но при этом Maven предоставляет гибкость, позволяя переопределять любую часть стандартной логики при необходимости.
Maven и расширяемость
Благодаря своей архитектуре, Maven легко адаптируется под различные сценарии.
Расширение происходит через:
Подключение плагинов.
Наследование и агрегацию POM'ов.
Создание собственных плагинов и Mojo.
Подключение профилей и переменных окружения.
Именно такая расширяемость делает Maven удобным не только для простых библиотек, но и для масштабных корпоративных решений.
#Java #middle #Maven
После первого знакомства с Maven важно не просто уметь пользоваться им, а понимать его архитектуру, принципы работы и идеологию. Это особенно критично для тех, кто хочет углубиться в автоматизацию, CI/CD и масштабирование проектов с помощью Maven.
Maven как декларативная модель
Maven основан на декларативной модели сборки: вы описываете, что должно быть сделано, а не как. Это противоположность императивным сборочным системам вроде Ant, где разработчик пишет шаг за шагом скрипты сборки. В Maven центром управления является файл pom.xml — он описывает структуру проекта, зависимости, плагины, цели сборки и метаинформацию.
Архитектура Maven
Архитектура Maven построена вокруг трёх ключевых сущностей:
1. POM (Project Object Model)
POM — сердце проекта. В нем описано всё: от координат артефакта (groupId, artifactId, version) до зависимостей, плагинов, профилей и модулей. POM определяет не только поведение сборки, но и организацию кода, стратегию управления версиями и способы расширения функциональности проекта.
2. Репозитории
Система Maven разделяет репозитории на три уровня:
Локальный (~/.m2/repository) — кеш библиотек и плагинов, уже использованных разработчиком
Центральный (Maven Central) — основной публичный репозиторий.
Удалённые (корпоративные) — приватные хранилища (Nexus, Artifactory и др.).
При разрешении зависимостей Maven сначала ищет артефакт в локальном репозитории, затем — в удалённых.
3. Плагины и цели (goals)
Maven сам по себе — движок исполнения, не знающий, как компилировать, тестировать или архивировать проект. Всё это делают плагины, привязанные к жизненному циклу. Например, maven-compiler-plugin отвечает за компиляцию, а maven-surefire-plugin — за запуск тестов. Каждый плагин состоит из целей (goals), которые выполняются в рамках фаз сборки.
Жизненный цикл сборки
Основой выполнения в Maven является жизненный цикл сборки (Build Lifecycle) — предопределённая последовательность фаз.
Есть три основных цикла:
default — основной, включает: compile, test, package, install, deploy.
clean — очищает артефакты: pre-clean, clean, post-clean.
site — генерирует документацию: site, site-deploy.
Maven всегда выполняет все фазы до указанной. То есть mvn install запустит validate, compile, test, package, verify, install.
Convention over Configuration
Одной из ключевых идей Maven является принцип «Конвенция важнее конфигурации» (Convention over Configuration):
Maven ожидает, что структура проекта будет стандартной:
src/
main/java/
test/java/
Артефакт будет упакован как jar (если не указано иное).
Папки ресурсов и тестов тоже стандартны.
Это означает, что вам не нужно конфигурировать то, что уже стандартизировано. Но при этом Maven предоставляет гибкость, позволяя переопределять любую часть стандартной логики при необходимости.
Maven и расширяемость
Благодаря своей архитектуре, Maven легко адаптируется под различные сценарии.
Расширение происходит через:
Подключение плагинов.
Наследование и агрегацию POM'ов.
Создание собственных плагинов и Mojo.
Подключение профилей и переменных окружения.
Именно такая расширяемость делает Maven удобным не только для простых библиотек, но и для масштабных корпоративных решений.
#Java #middle #Maven
Что выведет код?
#Tasks
import java.util.function.Consumer;
public class Task230625 {
public static void main(String[] args) {
Consumer<String> consumer1 = s -> System.out.print(s.toUpperCase());
Consumer<String> consumer2 = s -> System.out.print("|" + s + "|");
consumer1.andThen(consumer2).accept("test");
}
}
#Tasks
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓
Голосуем за тему к рассмотрению в эти выходные!
Выбираем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!✌️
Голосуем за тему к рассмотрению в эти выходные!
Выбираем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Lock и чем он лучше synchronized? 🤓
Ответ:
Интерфейс Lock (например, ReentrantLock) предоставляет более гибкую синхронизацию, чем synchronized.
Поддерживает тайм-ауты (tryLock), неблокирующие операции и возможность прерывания.
Пример:
Lock lock = new ReentrantLock();
lock.lock();
try {
// Критическая секция
} finally {
lock.unlock();
}
В отличие от synchronized, Lock требует явного вызова unlock().
#собеседование
Ответ:
Поддерживает тайм-ауты (tryLock), неблокирующие операции и возможность прерывания.
Пример:
Lock lock = new ReentrantLock();
lock.lock();
try {
// Критическая секция
} finally {
lock.unlock();
}
В отличие от synchronized, Lock требует явного вызова unlock().
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
Null как об отсутствии ссылки в Java
null в Java — это специальное зарезервированное значение, указывающее, что переменная-ссылка не указывает ни на один объект. Это важный элемент модели памяти Java, отражающий отсутствие объекта. null может быть присвоен любой переменной ссылочного типа: объекту, массиву, строке, интерфейсу и т.д.
Что такое null
Когда вы пишете:
Вы создаёте переменную name, которая не указывает на какой-либо объект в куче. Это эквивалентно "пустой" ссылке. Она существует, занимает место в стеке (как любая переменная), но не ссылается на объект в памяти.
Зачем нужен null
Обозначение "ничего"
Позволяет явно указать, что у переменной нет значения. Это особенно полезно, если объект должен быть присвоен позже или вычисляется по условию.
Инициализация по умолчанию
Все ссылки в Java по умолчанию равны null, если не инициализированы вручную.
Маркер отсутствия
null часто используется как сигнал того, что результат не найден, произошла ошибка, или объект ещё не готов.
Как работает null в памяти
Ссылочные переменные (например, Person person) хранятся в стеке.
Когда переменной присваивается null, это означает, что в ячейке стека отсутствует указатель на объект в куче.
Сам объект в куче при этом не создаётся или уже был уничтожен сборщиком мусора, если на него больше нет ссылок.
Здесь:
person — ячейка в стеке
Значение этой ячейки — специальное значение null (в JVM это просто 0 в ссылке)
Примеры использования
Плюсы использования null
Простота и ясность
Читабельный способ выразить "ничего", не создавая лишние объекты.
Низкие накладные расходы
Не требует выделения памяти в куче, что экономит ресурсы при инициализации.
Совместимость с другими системами
Многие API и базы данных возвращают null как знак "отсутствия значения".
Минусы и подводные камни
1. NullPointerException
Наиболее распространённая ошибка в Java — попытка вызвать метод или поле на null:
2. Неочевидность
Программа может работать "нормально", пока в какой-то момент не возникнет null в неожиданном месте. Это затрудняет отладку.
3. Проблемы при композиции
Методы, возвращающие null, требуют дополнительных проверок в вызывающем коде:
4. Не подходит для потокобезопасности
В многопоточных средах проверка на null может быть некорректной, если значение изменяется между проверкой и использованием.
Лучшие практики и альтернативы
Явная проверка на null
Использование Optional
Инициализация по умолчанию
Лучше избегать null, когда можно:
Контракты "никогда не null"
В современных проектах стараются придерживаться соглашения: параметры, возвращаемые значения и поля по умолчанию не null, если явно не сказано иное.
Специальные случаи и нюансы
Сравнение с null
Всегда используйте ==, а не equals() для сравнения с null.
Ссылочные типы и null
Массивы: могут быть null, отдельные элементы массива — тоже.
Строки: null — не то же самое, что пустая строка "".
Метод instanceof и null
null в параметрах
Вы можете передать null как аргумент в метод:
#Java #для_новичков #beginner #reference_types #null
null в Java — это специальное зарезервированное значение, указывающее, что переменная-ссылка не указывает ни на один объект. Это важный элемент модели памяти Java, отражающий отсутствие объекта. null может быть присвоен любой переменной ссылочного типа: объекту, массиву, строке, интерфейсу и т.д.
Что такое null
Когда вы пишете:
String name = null;
Вы создаёте переменную name, которая не указывает на какой-либо объект в куче. Это эквивалентно "пустой" ссылке. Она существует, занимает место в стеке (как любая переменная), но не ссылается на объект в памяти.
Зачем нужен null
Обозначение "ничего"
Позволяет явно указать, что у переменной нет значения. Это особенно полезно, если объект должен быть присвоен позже или вычисляется по условию.
Инициализация по умолчанию
Все ссылки в Java по умолчанию равны null, если не инициализированы вручную.
public class Example {
String name; // По умолчанию null
}
Маркер отсутствия
null часто используется как сигнал того, что результат не найден, произошла ошибка, или объект ещё не готов.
Как работает null в памяти
Ссылочные переменные (например, Person person) хранятся в стеке.
Когда переменной присваивается null, это означает, что в ячейке стека отсутствует указатель на объект в куче.
Сам объект в куче при этом не создаётся или уже был уничтожен сборщиком мусора, если на него больше нет ссылок.
Person person = null;
Здесь:
person — ячейка в стеке
Значение этой ячейки — специальное значение null (в JVM это просто 0 в ссылке)
Примеры использования
String userInput = null; // Пользователь ничего не ввёл
if (userInput == null) {
System.out.println("Пустой ввод");
}
List<String> list = getList();
if (list != null) {
list.add("new item");
}
Плюсы использования null
Простота и ясность
Читабельный способ выразить "ничего", не создавая лишние объекты.
Низкие накладные расходы
Не требует выделения памяти в куче, что экономит ресурсы при инициализации.
Совместимость с другими системами
Многие API и базы данных возвращают null как знак "отсутствия значения".
Минусы и подводные камни
1. NullPointerException
Наиболее распространённая ошибка в Java — попытка вызвать метод или поле на null:
String name = null;
System.out.println(name.length()); // NullPointerException
2. Неочевидность
Программа может работать "нормально", пока в какой-то момент не возникнет null в неожиданном месте. Это затрудняет отладку.
3. Проблемы при композиции
Методы, возвращающие null, требуют дополнительных проверок в вызывающем коде:
String result = compute();
if (result != null) {
...
}
Если забыть такую проверку — возможна ошибка.
4. Не подходит для потокобезопасности
В многопоточных средах проверка на null может быть некорректной, если значение изменяется между проверкой и использованием.
Лучшие практики и альтернативы
Явная проверка на null
Objects.requireNonNull(input, "Input must not be null");
Использование Optional
Optional<String> result = Optional.ofNullable(getName());
result.ifPresent(System.out::println);
Optional помогает избежать null, особенно в возвращаемых значениях.
Инициализация по умолчанию
Лучше избегать null, когда можно:
List<String> list = new ArrayList<>(); // вместо null
Контракты "никогда не null"
В современных проектах стараются придерживаться соглашения: параметры, возвращаемые значения и поля по умолчанию не null, если явно не сказано иное.
Специальные случаи и нюансы
Сравнение с null
if (obj == null) { ... }
Всегда используйте ==, а не equals() для сравнения с null.
obj.equals(null); // Может выбросить NPE, если obj == null
Ссылочные типы и null
Массивы: могут быть null, отдельные элементы массива — тоже.
Строки: null — не то же самое, что пустая строка "".
String s1 = null;
String s2 = "";
System.out.println(s1 == s2); // false
Метод instanceof и null
String s = null;
System.out.println(s instanceof String); // false
null в параметрах
Вы можете передать null как аргумент в метод:
printName(null);
Но важно, чтобы метод корректно это обрабатывал.
#Java #для_новичков #beginner #reference_types #null
Forwarded from ChatRoom (Java for Beginner) (Первожрец Java)
А есть еще желающие активно поучаствовать в учебной разработке приложения на Spring? Пишите! 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
#Tasks
public class Task240625 {
public static void main(String[] args) {
String s = null;
s = s + "Java";
System.out.println(s);
}
}
#Tasks
Варианты ответа:
Anonymous Quiz
9%
null
45%
"Java"
18%
"nullJava"
27%
Ошибка выполнения (NullPointerException)
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓
Голосуем за тему к рассмотрению в эти выходные!
Выбираем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!✌️
Голосуем за тему к рассмотрению в эти выходные!
Выбираем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое deadlock и как его избежать? 🤓
Ответ:
Deadlock (взаимная блокировка) возникает, когда два или более потока ждут друг друга для освобождения ресурсов.
Пример:
поток A ждет ресурс X, удерживая Y, а поток B ждет Y, удерживая X.
Избежать можно:
- Упорядочивая захват ресурсов.
- Используя тайм-ауты (tryLock в Lock).
- Минимизируя области синхронизации.
Пример упорядочивания:
synchronized (resource1) {
synchronized (resource2) {
// Работа с ресурсами
}
}
#собеседование
Ответ:
Пример:
поток A ждет ресурс X, удерживая Y, а поток B ждет Y, удерживая X.
Избежать можно:
- Упорядочивая захват ресурсов.
- Используя тайм-ауты (tryLock в Lock).
- Минимизируя области синхронизации.
Пример упорядочивания:
synchronized (resource1) {
synchronized (resource2) {
// Работа с ресурсами
}
}
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM