Java for Beginner
678 subscribers
562 photos
156 videos
12 files
862 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Что такое enum в Java? 🤓

Ответ:

enum — это специальный тип для представления фиксированного набора констант.
Каждый элемент enum — это объект класса. Поддерживает методы и поля.

Пример:
enum Day {
MONDAY, TUESDAY;
public String getName() { return name().toLowerCase(); }
}

Используется для типобезопасных констант, например, дней недели или статусов.

#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Жизненный цикл Maven: Полное понимание фаз и процессов

Maven — это мощный инструмент управления сборкой проектов, ядро которого составляет концепция жизненного цикла. Жизненный цикл Maven определяет последовательность фаз, через которые проходит проект во время сборки, обеспечивая предсказуемость и структурированность процесса.


Структура жизненного цикла Maven

Maven использует три основных жизненных цикла, каждый из которых представляет собой набор фаз, выполняемых последовательно для достижения определенной цели. Эти циклы — Clean, Default (Build) и Site — охватывают различные аспекты работы с проектом, от очистки до развертывания документации.



Clean Lifecycle

Жизненный цикл Clean отвечает за удаление артефактов, созданных в процессе предыдущих сборок, чтобы обеспечить чистую рабочую среду.


Он состоит из трех фаз:

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

clean: Основная фаза очистки. Удаляет директорию target, содержащую скомпилированные классы, JAR-файлы, WAR-файлы и другие артефакты. По умолчанию к этой фазе привязан плагин maven-clean-plugin с целью clean.
post-clean: Завершающие действия после очистки. Эта фаза редко используется, но может быть полезна для выполнения дополнительных операций, таких как логирование или уведомления.

В памяти на этапе Clean происходит освобождение ресурсов, связанных с предыдущими сборками. Maven загружает конфигурацию проекта (POM-файл) в оперативную память, создает объектную модель проекта (POM model), которая хранит метаданные о проекте, зависимостях и плагинах. Во время выполнения clean Maven взаимодействует с файловой системой, удаляя указанные директории, что минимизирует использование памяти, так как не создаются новые артефакты.


Default (Build) Lifecycle

Default — наиболее важный жизненный цикл, охватывающий процесс сборки, тестирования и развертывания артефактов.

Он включает множество фаз, из которых наиболее часто используемые:

validate: Проверяет корректность структуры проекта и наличие всех необходимых ресурсов, таких как POM-файл и зависимости. Maven загружает и валидирует модель POM, проверяя синтаксис и доступность репозиториев.

compile: Компилирует исходный код проекта. По умолчанию используется maven-compiler-plugin, который преобразует Java-файлы в байт-код, сохраняя его в директории target/classes.

test: Выполняет модульные тесты с использованием плагинов, таких как maven-surefire-plugin. Тесты запускаются в изолированной среде, а результаты сохраняются в target/surefire-reports.

package: Создает артефакт (JAR, WAR, EAR и т.д.) на основе скомпилированного кода и ресурсов. Используется, например, maven-jar-plugin для создания JAR-файлов.


verify: Проверяет качество артефакта, выполняя интеграционные тесты или проверки, например, с помощью maven-failsafe-plugin.

install: Устанавливает артефакт в локальный репозиторий (~/.m2/repository), делая его доступным для других локальных проектов.

deploy: Разворачивает артефакт в удаленный репозиторий для общего использования. Используется maven-deploy-plugin.

Каждая фаза Default цикла добавляет новые данные в директорию target, что увеличивает объем используемой памяти. Например, во время компиляции Maven загружает в память исходные файлы, зависимости и настройки компилятора. Плагины, такие как maven-compiler-plugin, создают временные структуры данных для хранения промежуточного байт-кода перед его записью на диск. Это может быть критично для крупных проектов, где объем памяти, необходимый для хранения классов и ресурсов, значительно возрастает.

#Java #middle #Maven #LifeCicle
Site Lifecycle

Site цикл отвечает за генерацию и развертывание документации проекта.

Он включает две фазы:

site
: Генерирует документацию, такую как Javadoc или отчеты о покрытии кода, используя плагины вроде maven-site-plugin. Результаты сохраняются в target/site.

site-deploy: Разворачивает сгенерированную документацию на сервер, например, с помощью maven-scm-publish-plugin.


На этапе Site Maven загружает в память шаблоны для генерации документации, а также данные о проекте, такие как зависимости и отчеты. Использование памяти зависит от объема документации и сложности отчетов, например, при генерации Javadoc для большого проекта.


Заказ выполнения фаз и их взаимосвязь

Фазы в каждом жизненном цикле выполняются строго последовательно, и выполнение одной фазы автоматически запускает все предыдущие фазы в рамках того же цикла. Например, вызов mvn install в Default цикле приведет к выполнению всех фаз от validate до install в следующем порядке: validate, compile, test, package, verify, install. Это обеспечивает целостность сборки, так как каждая фаза опирается на результаты предыдущих.

Между циклами нет автоматической связи. Например, выполнение mvn clean не запускает фазы Default цикла. Однако часто используется комбинация циклов, например, mvn clean install, где сначала выполняется очистка, а затем полный цикл сборки. Maven обрабатывает такие команды последовательно, освобождая память после завершения каждого цикла, если это возможно.

В памяти Maven поддерживает объектную модель проекта, которая обновляется на каждой фазе. Например, на фазе compile добавляются данные о скомпилированных классах, а на фазе test — результаты тестов. Если процесс сборки прерывается, Maven сохраняет промежуточные результаты на диске (в target), чтобы минимизировать потери при повторном запуске.


Bindings фаз к плагинам по умолчанию

Каждая фаза жизненного цикла связана с определенными целями (goals) плагинов, которые выполняют конкретные задачи. Maven использует механизм привязки (bindings), чтобы ассоциировать фазы с плагинами.

Например:
Фаза clean привязана к цели clean плагина maven-clean-plugin.
Фаза compile связана с целью compile плагина maven-compiler-plugin.
Фаза test использует цель test плагина maven-surefire-plugin.


Эти привязки определяются в так называемом "super POM" — базовом POM-файле, который наследуется всеми проектами Maven. Super POM задает стандартное поведение, но его можно переопределить в пользовательском POM-файле.

В памяти плагины загружаются как Java-объекты через классовый загрузчик Maven. Каждый плагин создает собственный контекст выполнения, который включает конфигурацию из POM-файла и параметры, переданные через командную строку. Это может приводить к значительному потреблению памяти, особенно если плагин выполняет сложные операции, такие как компиляция или анализ кода.


#Java #middle #Maven #LifeCicle
Переопределение и расширение поведения фаз

Maven позволяет гибко настраивать поведение фаз через пользовательские конфигурации и плагины.

Переопределение возможно несколькими способами:
Изменение настроек плагина в POM-файле. Например, для maven-compiler-plugin можно указать версию Java или дополнительные параметры компиляции:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>


Эти настройки загружаются в память во время выполнения фазы compile и влияют на поведение плагина.


Добавление пользовательских целей.

Можно привязать дополнительные цели плагинов к существующим фазам. Например, чтобы запустить статический анализ кода на фазе verify:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>3.0.5</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>



Пропуск фаз.

Некоторые фазы можно пропустить, задав соответствующие параметры, например, -DskipTests для пропуска тестов на фазе test. Это уменьшает нагрузку на память, так как Maven не загружает плагины и ресурсы, связанные с пропущенной фазой.

Переопределение требует осторожности, так как неправильная конфигурация может нарушить порядок выполнения или зависимости между фазами. Maven хранит конфигурацию плагинов в памяти в виде объектов Mojo (Maven Plugin Objects), которые создаются для каждой цели плагина. Это может привести к увеличению потребления памяти при большом количестве плагинов или сложных конфигураций.



Custom Lifecycles (Создание кастомных жизненных циклов)

Maven позволяет создавать пользовательские жизненные циклы, хотя это редко используется в повседневной практике. Кастомный жизненный цикл определяется в файле components.xml в папке META-INF/plexus проекта.

Пример структуры:
<component-set>
<components>
<component>
<role>org.apache.maven.lifecycle.Lifecycle</role>
<implementation>org.apache.maven.lifecycle.DefaultLifecycle</implementation>
<configuration>
<id>custom-lifecycle</id>
<phases>
<phase>custom-phase</phase>
</phases>
</configuration>
</component>
</components>
</component-set>


После определения кастомного цикла к его фазам можно привязать плагины в POM-файле.

Например:
<plugin>
<groupId>com.example</groupId>
<artifactId>custom-plugin</artifactId>
<executions>
<execution>
<phase>custom-phase</phase>
<goals>
<goal>custom-goal</goal>
</goals>
</execution>
</executions>
</plugin>


Создание кастомного цикла требует загрузки дополнительных компонентов в память, включая пользовательские классы и конфигурации. Maven использует Plexus, контейнер IoC (Inversion of Control), для управления компонентами жизненного цикла. Это увеличивает сложность и потребление памяти, так как Plexus создает дополнительные объекты для обработки кастомных фаз.

Кастомные циклы полезны для специфических проектов, например, для генерации артефактов нестандартного формата или выполнения уникальных процессов сборки. Однако их использование требует глубокого понимания внутренней архитектуры Maven и может усложнить поддержку проекта.


#Java #middle #Maven #LifeCicle
Нюансы и внутренние механизмы

Управление памятью.
Maven работает как Java-приложение, и его потребление памяти зависит от размера проекта, количества зависимостей и используемых плагинов.


Основные объекты в памяти:

POM model: Хранит структуру проекта, зависимости и конфигурации. Создается при загрузке POM-файла и обновляется на каждой фазе.
Plugin instances: Каждый плагин создает экземпляр объекта Mojo, который хранит конфигурацию и состояние выполнения.
Classloaders: Maven использует отдельные загрузчики классов для плагинов, чтобы изолировать их зависимости. Это может привести к фрагментации памяти при большом количестве плагинов.


Для оптимизации памяти можно использовать флаги JVM, такие как -Xmx и -Xms, или минимизировать количество одновременно выполняемых плагинов.
Обработка ошибок. Если фаза завершается с ошибкой (например, тест не проходит), Maven прерывает выполнение цикла. Промежуточные результаты сохраняются в target, но объекты в памяти освобождаются сборщиком мусора. Это важно учитывать при отладке, так как повторный запуск может требовать полной перезагрузки модели проекта.


Многомодульные проекты.
В проектах с несколькими модулями Maven создает отдельную модель для каждого модуля, что увеличивает потребление памяти. Фазы выполняются для каждого модуля последовательно, но Maven оптимизирует процесс, кэшируя зависимости в локальном репозитории.


Параллельное выполнение.
С флагом -T (например, -T 4 для четырех потоков) Maven может выполнять фазы параллельно для разных модулей. Это ускоряет сборку, но увеличивает пиковое потребление памяти, так как одновременно обрабатываются несколько моделей POM и плагинов.

Кэширование
.
Maven кэширует зависимости и артефакты в локальном репозитории (~/.m2/repository), что снижает нагрузку на сеть и память при повторных сборках. Однако при использовании флага --offline Maven полностью полагается на локальный кэш, что может вызвать ошибки, если зависимости отсутствуют.

#Java #middle #Maven #LifeCicle
Что выведет код?

import java.util.function.Predicate;

public class Task270625 {
public static void main(String[] args) {
Predicate<String> p1 = s -> s.length() > 5;
Predicate<String> p2 = s -> s.startsWith("J");

System.out.println(p1.or(p2).test("Java"));
}
}


#Tasks
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓

Голосуем за тему к рассмотрению в эти выходные!

Выбираем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)

Не стесняемся! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое JDBC и как с ним работать? 🤓

Ответ:

JDBC (Java Database Connectivity) — API для работы с базами данных.

Позволяет выполнять SQL-запросы из Java. Основные шаги: загрузка драйвера, создание подключения, выполнение запроса, обработка результата.

Пример:
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "pass");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while (
rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}

Для потокобезопасности и управления ресурсами рекомендуется использовать try-with-resources.

#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM