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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Module Inheritance

Наследование в многомодульных проектах позволяет централизовать конфигурацию.

Модули наследуют от родительского POM:

Метаданные: <groupId>, <version> (если не переопределены в модуле).
Свойства: <properties> для общих настроек, таких как версии Java или библиотек.
Управление зависимостями: <dependencyManagement> задает версии зависимостей, которые модули могут использовать без указания версии.
Управление плагинами: <pluginManagement> определяет версии и конфигурации плагинов.
Репозитории: <repositories> и <pluginRepositories> для загрузки артефактов.


Пример наследования зависимостей:
<!-- parent POM -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>

<!-- module POM -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>


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


Нюансы наследования

Переопределение: Модуль может переопределить унаследованные настройки, например, указав собственный <version> или <properties>.
Глубокое наследование: Если родительский POM сам наследуется от другого POM,
Maven рекурсивно загружает все родительские модели, что увеличивает потребление памяти.
Конфликты: Неправильное переопределение (например, дублирование плагинов) может вызвать ошибки. Используйте mvn help:effective-pom для анализа итоговой конфигурации.



Разделение по слоям: API, Core, Impl, Web


Многомодульные проекты часто структурируются по слоям для разделения ответственности.


Типичная структура:
API: Содержит интерфейсы, DTO и публичные контракты. Упаковка — JAR. Пример: module-api.
Core: Реализует бизнес-логику, зависящую от API. Упаковка — JAR. Пример: module-core.
Impl: Конкретные реализации, например, интеграция с базами данных. Упаковка — JAR. Пример: module-impl.
Web: Веб-приложение, зависящее от Core или Impl. Упаковка — WAR. Пример: module-web.


Пример структуры:
project-root/
├── pom.xml (parent/aggregator)
├── module-api/
│ └── pom.xml
├── module-core/
│ └── pom.xml
├── module-impl/
│ └── pom.xml
├── module-web/
│ └── pom.xml


Зависимости между модулями:
<!-- module-core POM -->
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>module-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

<!-- module-web POM -->
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>module-core</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>


В памяти Maven строит граф зависимостей, где модули являются узлами. Реактор (см. ниже) определяет порядок сборки, чтобы гарантировать, что module-api собирается до module-core, а module-core — до module-web. Это увеличивает объем памяти, так как Maven хранит метаданные всех модулей и их взаимосвязи.


Преимущества разделения

Модульность: Упрощает тестирование и повторное использование.
Четкие границы: Снижает связанность между компонентами.
Параллельная разработка: Команды могут работать над разными модулями независимо.


Нюансы

Циклические зависимости:
Maven не допускает циклических зависимостей между модулями (например, module-api зависит от module-core, а module-core — от module-api). Это проверяется реактором, и при обнаружении цикла сборка завершается с ошибкой.
Размер графа: Большое количество модулей увеличивает сложность графа зависимостей, что требует больше памяти для хранения и обработки.



#Java #middle #Maven #Profiles #Parent_POM #MultiModule #Module_Inheritance
👍3
Best Practices

Versioning и dependencyManagement

Единая версия: Используйте одинаковую версию для всех модулей, унаследованную от родительского POM (${project.version}). Это упрощает управление и предотвращает несовместимость.
dependencyManagement: Централизуйте версии зависимостей в родительском POM:<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version>
</dependency>
</dependencies>
</dependencyManagement>


Это снижает дублирование и обеспечивает согласованность версий.
pluginManagement: Аналогично управляйте версиями плагинов:<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>


В памяти dependencyManagement и pluginManagement хранятся как часть родительской POM-модели, минимизируя дублирование данных в модулях.


CI/CD подходы с модулями

Полная сборка: Настройте CI/CD (например, Jenkins, GitHub Actions) для выполнения полной сборки через mvn clean install в корне проекта. Это гарантирует, что все модули совместимы.
Инкрементальная сборка: Для ускорения используйте флаг --also-make (-am) или --projects (-pl) для сборки только измененных модулей (см. ниже).


Публикация артефактов: Используйте mvn deploy для загрузки артефактов в репозиторий (например, Nexus).
Настройте <distributionManagement> в родительском POM:<distributionManagement>
<repository>
<id>nexus</id>
<url>https://nexus.example.com/repository/maven-releases/</url>
</repository>
</distributionManagement>


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


Сборка части дерева

Maven позволяет собирать отдельные модули или их поддерево с помощью опций реактора:
Выбор модуля: Собрать только указанный модуль:mvn package -pl module-web
Включение зависимостей: Собрать модуль и все его зависимости:mvn package -pl module-web -am
Исключение модулей: Пропустить модуль:mvn package -pl !module-api


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


Работа с реактором

Реактор (Reactor) — это внутренний механизм
Maven, который управляет порядком сборки модулей в многомодульном проекте.

Реактор:
Строит граф модулей: Анализирует <modules> в агрегирующем POM и зависимости между модулями (через <dependencies>).
Определяет порядок: Выполняет топологическую сортировку графа, чтобы модули, от которых зависят другие, собирались первыми.
Координирует сборку: Запускает жизненный цикл для каждого модуля в рассчитанном порядке.


В памяти реактор хранит граф модулей как направленный ациклический граф (DAG), где узлы — модули, а ребра — зависимости. Размер графа пропорционален количеству модулей, что увеличивает потребление памяти в крупных проектах. Реактор также кэширует промежуточные артефакты в ~/.m2/repository, чтобы избежать повторной сборки неизмененных модулей.

Нюансы реактора

Циклические зависимости: Реактор обнаруживает циклы и завершает сборку с ошибкой. Используйте mvn dependency:tree для анализа.
Пропуск модулей: Флаг -pl или -am изменяет граф, который обрабатывает реактор, уменьшая объем памяти.
Ошибки: Если модуль завершает сборку с ошибкой, реактор останавливает процесс, но промежуточные артефакты сохраняются в target.


#Java #middle #Maven #Profiles #Parent_POM #MultiModule #Module_Inheritance
👍3
Жизненный цикл в многомодульных проектах

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

Последовательность: Реактор вызывает фазы жизненного цикла (например, validate, compile, package) для каждого модуля по очереди. Например, mvn package сначала выполнит package для module-api, затем для module-core и так далее.
Параллельность: С флагом -T
Maven выполняет фазы для независимых модулей параллельно, что ускоряет сборку, но увеличивает потребление памяти из-за одновременной загрузки нескольких POM-моделей и плагинов.
Общие ресурсы: Родительский POM задает общие плагины и зависимости, которые загружаются в память один раз и используются всеми модулями, оптимизируя ресурсы.
Пропуск фаз: Флаги, такие как -DskipTests, применяются ко всем модулям, что снижает нагрузку на память.


В памяти Maven хранит модель жизненного цикла для каждого модуля, включая привязки плагинов к фазам. Для крупных проектов это может привести к значительному потреблению памяти, особенно на фазах, таких как compile или test, где загружаются исходные файлы, зависимости и результаты тестов.

Нюансы

Инкрементальная сборка: Maven использует временные метки файлов в target, чтобы пропускать неизмененные модули. Это снижает нагрузку на память и процессор.
Ошибки в модуле: Если одна фаза завершается с ошибкой в модуле,
Maven останавливает сборку, но уже созданные артефакты сохраняются.
Кэширование артефактов: Модули, установленные в ~/.m2/repository (через mvn install), не пересобираются при повторных запусках, что оптимизирует производительность.



Нюансы и внутренние механизмы

Управление памятью:
Maven загружает модель POM для каждого модуля, создавая объединенную модель проекта. Это увеличивает потребление памяти пропорционально количеству модулей.
Реактор строит граф модулей в памяти, что требует дополнительных ресурсов для хранения и сортировки.
Параллельная сборка (-T) увеличивает пиковое потребление памяти из-за одновременной обработки нескольких модулей.
Для оптимизации используйте -pl для выборочной сборки и настройте JVM с помощью -Xmx.


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

Конфликты зависимостей:
Модули могут использовать разные версии одной библиотеки, что приводит к конфликтам. Используйте <dependencyManagement> для согласованности.
Плагин
maven-enforcer-plugin с правилом dependencyConvergence помогает выявить конфликты.

Производительность:
Инкрементальная сборка и кэширование ускоряют процесс, но первый запуск или полная сборка (mvn clean) могут быть медленными.
Параллельная сборка сокращает время, но требует мощного оборудования из-за высокой нагрузки на память и процессор.


Отладка:
Используйте mvn -X для вывода подробной информации о порядке сборки и загрузке модулей.
Команда mvn dependency:tree -pl module-name помогает анализировать зависимости конкретного модуля.
Плагин help:effective-pom показывает итоговую конфигурацию модуля с учетом наследования.


CI/CD интеграция:
Настройте CI/CD для выполнения mvn clean install на каждое изменение, чтобы гарантировать целостность всех модулей.
Используйте матричные сборки для тестирования модулей в разных окружениях (например, разные версии Java).
Храните SNAPSHOT-версии в репозитории (например, Nexus) для промежуточных сборок, а релизные версии — в отдельном репозитории.


#Java #middle #Maven #Profiles #Parent_POM #MultiModule #Module_Inheritance
👍3
Расширенные темы и интеграции Maven

CI/CD интеграция

Maven широко используется в CI/CD-пайплайнах для автоматизации сборки, тестирования и развертывания. Рассмотрим интеграцию с популярными системами и связанные процессы, такие как GPG-подпись и развертывание артефактов.

Jenkins, GitLab CI, GitHub Actions с Maven

Jenkins:

Конфигурация: Создайте задачу (Job) типа "Freestyle" или "Pipeline". В Freestyle добавьте шаг "Invoke top-level Maven targets":mvn clean install

В Pipeline используйте Jenkinsfile:
pipeline {
agent any
tools {
maven 'Maven 3.8.6'
jdk 'JDK11'
}
stages {
stage('Build') {
steps {
sh 'mvn clean install'
}
}
}
}


Параллельность: Используйте флаг -T для параллельной сборки модулей, например, -T 4.
Плагины: Используйте
maven-release-plugin для автоматизации релизов:mvn release:prepare release:perform

GitLab CI:

Конфигурация: Определите .gitlab-ci.yml:

stages:
- build
build:
stage: build
image: maven:3.8.6-openjdk-11
script:
- mvn clean install
artifacts:
paths:
- target/*.jar


Кэширование: Кэшируйте ~/.m2/repository для ускорения:
cache:
paths:
- ~/.m2/repository


GitHub Actions:

Конфигурация: Создайте .github/workflows/maven.yml:name:
Maven Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Build with Maven
run: mvn clean install
- name: Cache Maven dependencies
uses: actions/cache@v3
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}


Артефакты: Используйте действие actions/upload-artifact для сохранения JAR/WAR.

В памяти: CI/CD-системы запускают Maven как Java-процесс, загружая POM-модель, зависимости и плагины в оперативную память. Параллельная сборка (-T) увеличивает пиковое потребление памяти, так как одновременно обрабатываются несколько модулей. Кэширование ~/.m2/repository снижает сетевые запросы, но требует места на диске.


Работа с GPG Signing, Artifact Deployment

GPG Signing:GPG-подпись артефактов необходима для публикации в Maven Central. Используется maven-gpg-plugin.

Настройка в POM.xml:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>


Шаги:
Установите GPG и создайте ключ: gpg --gen-key.
Опубликуйте публичный ключ: gpg --keyserver
keyserver.ubuntu.com --send-keys <key-id>.

Настройте ~/.m2/settings.xml с GPG-паролем:
<server>
<id>gpg.passphrase</id>
<passphrase>{encrypted-passphrase}</passphrase>
</server>


Подпишите артефакты:
mvn clean deploy -Dgpg.passphrase=<passphrase>.


В памяти: Плагин maven-gpg-plugin загружает GPG-ключи и артефакты в память для подписи, что увеличивает потребление ресурсов, особенно для крупных JAR/WAR.

Artifact Deployment:Развертывание артефактов в репозиторий (например, Nexus, Maven Central) выполняется через maven-deploy-plugin:
<distributionManagement>
<repository>
<id>nexus</id>
<url>https://nexus.example.com/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<url>https://nexus.example.com/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>


Запуск: mvn deploy.
SNAPSHOT vs Release: SNAPSHOT-версии (1.0.0-SNAPSHOT) обновляются в репозитории, релизные версии (1.0.0) публикуются однократно.
В памяти: Плагин maven-deploy-plugin загружает артефакт и его метаданные в память перед отправкой в репозиторий. Сетевые операции могут замедлить процесс, но потребление памяти минимально.

#Java #middle #Maven #Best_practics
👍1
Archetypes

Архетипы — это шаблоны проектов, которые позволяют быстро создавать структуру с предопределенными файлами, зависимостями и конфигурацией. Maven предоставляет встроенные архетипы, такие как maven-archetype-quickstart.

Использование:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

Пользователь вводит groupId, artifactId, version, и Maven генерирует проект.


Создание собственного архетипа

Создайте проект с желаемой структурой:
my-archetype/
├── src/
│ └── main/
│ └── resources/
│ ├── archetype-resources/
│ │ ├── src/main/java/App.java
│ │ └── pom.xml
│ └── META-INF/maven/
│ └── archetype-metadata.xml
└── pom.xml


В archetype-metadata.xml опишите структуру:
<archetype-descriptor>
<fileSets>
<fileSet filtered="true" packaged="true">
<directory>src/main/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</fileSet>
</fileSets>
</archetype-descriptor>


Сгенерируйте архетип:
mvn archetype:create-from-project

Результат появится в target/generated-sources/archetype.


Установите архетип:
cd target/generated-sources/archetype
mvn install


Используйте архетип:
mvn archetype:generate -DarchetypeGroupId=com.example -DarchetypeArtifactId=my-archetype -DarchetypeVersion=1.0


В памяти: Архетипы загружают шаблонные файлы и их метаданные в память. Плагин maven-archetype-plugin парсит archetype-metadata.xml и заменяет переменные (например, ${groupId}), что требует минимальных ресурсов, но может быть затратным для сложных архетипов с большим количеством файлов.


Использование Maven Wrapper (mvnw)

Maven Wrapper (mvnw) — это скрипт, который обеспечивает использование конкретной версии Maven, независимо от установленной на машине. Он включает файлы mvnw (или mvnw.cmd для Windows), .mvn/wrapper/maven-wrapper.jar и .mvn/wrapper/maven-wrapper.properties.

Установка:
mvn -N wrapper:wrapper -Dmaven=3.8.6

Создает mvnw, который загружает указанную версию Maven.


Использование:
./mvnw clean install

Скрипт проверяет .mvn/wrapper/maven-wrapper.properties, загружает нужную версию Maven и выполняет команду.


В памяти: mvnw запускает Maven как отдельный Java-процесс, загружая maven-wrapper.jar в память. Это добавляет небольшой overhead, но гарантирует согласованность сборки. Кэширование Maven в .m2/repository минимизирует сетевые запросы.

Нюансы:
Храните mvnw и .mvn в репозитории для обеспечения воспроизводимости.
Обновляйте версию
Maven в maven-wrapper.properties для поддержки новых функций.


Поддержка Java версий

Maven поддерживает проекты с разными версиями Java через maven-compiler-plugin:
<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>



Многомодульные проекты

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

Toolchains: Для кросс-компиляции используйте ~/.m2/toolchains.xml:
<toolchains>
<toolchain>
<type>jdk</type>
<provides>
<version>11</version>
</provides>
<configuration>
<jdkHome>/path/to/jdk11</jdkHome>
</configuration>
</toolchain>
</toolchains>


Укажите toolchain в POM.xml:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-toolchains-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<goals>
<goal>toolchain</goal>
</goals>
</execution>
</executions>
<configuration>
<toolchains>
<jdk>
<version>11</version>
</jdk>
</toolchains>
</configuration>
</plugin>


#Java #middle #Maven #Best_practics
👍2
Расширение Maven

Extensions

Расширения Maven — это JAR-файлы, которые добавляют функциональность, например, кастомные жизненные циклы или обработчики репозиториев.

Они указываются в .mvn/extensions.xml:
<extensions>
<extension>
<groupId>com.example</groupId>
<artifactId>custom-extension</artifactId>
<version>1.0</version>
</extension>
</extensions>


Создание:

Создайте проект с зависимостью maven-core.
Реализуйте интерфейс, например, org.apache.
maven.AbstractMavenLifecycleParticipant.
Упакуйте как JAR и установите в репозиторий.


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


Интернальные API Maven

Maven предоставляет API (maven-core, maven-plugin-api) для создания плагинов и расширений.

Пример использования org.apache.maven.project.MavenProject для доступа к модели проекта:
@Mojo(name = "custom")
public class CustomMojo extends AbstractMojo {
@Parameter(defaultValue = "${project}")
private MavenProject project;

public void execute() throws MojoExecutionException {
getLog().info("Project artifact: " + project.getArtifactId());
}
}


В памяти: Интернальные API загружают объекты POM-модели и контекста сборки, что может быть ресурсоемким для сложных операций, таких как анализ зависимостей.

Логирование и отладка:
 -X, -e


Флаг -X: Включает отладочный режим, выводя подробную информацию о сборке, плагинах, зависимостях и реакторе:
mvn package -X

Увеличивает объем логов, что может замедлить выполнение и потребовать больше памяти для буферизации вывода.


Флаг -e: Выводит стек вызовов при ошибках:
mvn package -e

Полезно для диагностики, минимально влияет на память.


Плагины для отладки:
mvn help:effective-pom: Показывает итоговую модель POM.
mvn dependency:tree: Анализирует зависимости.
mvn help:effective-settings: Показывает настройки settings.xml.


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


Сравнение и миграция с Ant/Gradle

Ant

Сравнение:
Ant: Императивный подход, где задачи определяются вручную в XML (build.xml). Нет встроенного управления зависимостями или жизненного цикла.
Maven: Декларативный подход с жизненным циклом и автоматическим разрешением зависимостей.

Миграция:
Перенесите задачи Ant в плагины Maven (например, maven-antrun-plugin для запуска Ant-скриптов).
Преобразуйте зависимости в POM.xml с помощью <dependency>.
Используйте mvn ant:ant для генерации build.xml из
Maven для обратной совместимости.


Gradle

Сравнение:
Gradle: Гибридный подход (декларативный + императивный), использует Groovy/Kotlin DSL. Более гибкий, но сложнее в освоении.
Maven: Стандартизированный XML, проще для новичков, но менее гибкий.
Gradle быстрее благодаря инкрементальной сборке и кэшированию.


Миграция:
Используйте build.gradle с плагином maven-publish для публикации артефактов в Maven-репозитории.
Конвертируйте POM.xml в build.gradle с помощью инструментов, таких как gradle init.
Перенесите зависимости из <dependencyManagement> в dependencies Gradle.


В памяти: Ant использует меньше памяти из-за отсутствия сложных моделей, но требует больше ручной работы. Gradle может потреблять больше памяти из-за Groovy/Kotlin и сложных скриптов. Maven занимает среднюю позицию, но его POM-модель и граф зависимостей требуют значительных ресурсов в крупных проектах.

#Java #middle #Maven #Best_practics
👍2
Maven Best Practices: от Apache и Spring

Apache Best Practices
Централизация конфигурации: Используйте <dependencyManagement> и <pluginManagement> в родительском POM.
Минимизация зависимостей: Исключайте ненужные транзитивные зависимости через <exclusions>.
Профили: Используйте профили для окружений (dev, prod).
Кэширование: Настройте CI/CD для кэширования ~/.m2/repository.
Плагины: Используйте последние версии плагинов и проверяйте их совместимость.

Spring Best Practices

Spring Boot BOM: Используйте spring-boot-starter-parent или spring-boot-dependencies для управления версиями:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>


Минимизация конфигурации: Полагайтесь на автоконфигурацию Spring Boot вместо ручной настройки плагинов.

Плагины: Используйте spring-boot-maven-plugin для создания исполняемых JAR:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>


В памяти: Spring Boot BOM увеличивает объем POM-модели из-за большого числа зависимостей, но упрощает управление версиями. Плагин spring-boot-maven-plugin загружает дополнительные данные для создания "fat JAR", что может быть ресурсоемким.


Нюансы и внутренние механизмы

Управление памятью:
Maven загружает POM-модели, настройки и зависимости в память, создавая графы для модулей и артефактов. Крупные проекты с сотнями зависимостей могут потреблять гигабайты памяти.
Параллельная сборка (-T) и отладка (-X) увеличивают пиковое потребление.
Оптимизируйте с помощью -pl, -am и JVM-флагов (-Xmx).


Кэширование:
Локальный репозиторий (~/.m2/repository) снижает сетевые запросы, но требует периодической очистки устаревших SNAPSHOT-версий.
CI/CD-кэширование ускоряет сборку, но увеличивает использование диска.


Безопасность:
Шифруйте пароли для репозиториев с помощью mvn --encrypt-password.
Ограничивайте доступ к ~/.m2/settings-security.xml (chmod 600).



Производительность:

Инкрементальная сборка минимизирует повторные компиляции, но требует точной настройки временных меток в target.
Gradle может быть быстрее для инкрементальных сборок, но
Maven проще для стандартизированных проектов.

Отладка:
Используйте -X для анализа реактора и зависимостей.
Проверяйте конфликты с mvn dependency:tree -Dverbose.
Анализируйте итоговую конфигурацию с mvn help:effective-pom.



#Java #middle #Maven #Best_practics
👍2
Maven в IntelliJ IDEA: Встроенный Maven и его роль


Как работает встроенный Maven

Расположение: IntelliJ IDEA включает Maven в свою установку (обычно в <IntelliJ IDEA installation>/plugins/maven/lib).
Версия: IDEA использует конкретную версию
Maven (например, 3.8.6 в последних версиях), которая обновляется с новыми релизами IDE.
Интеграция: IDEA вызывает
Maven через внутренний API, а не через командную строку. Это позволяет управлять сборкой, зависимостями и плагинами из интерфейса IDE.

Конфигурация: Настройки хранятся в File > Settings > Build, Execution, Deployment > Build Tools > Maven:

Maven home path: По умолчанию Bundled (Maven).
User settings file: Можно указать ~/.m2/settings.xml.
Local repository: По умолчанию ~/.m2/repository, но можно настроить.


В памяти: Встроенный Maven загружается в JVM IntelliJ IDEA, разделяя память с IDE. Это увеличивает общее потребление памяти, особенно при выполнении сложных сборок. IDEA кэширует зависимости в ~/.m2/repository, синхронизируя их с системным Maven.


Замена системного Maven

IntelliJ IDEA по умолчанию использует встроенный Maven, но позволяет переключиться на системный:

Переключение на системный Maven:
Откройте File > Settings > Build, Execution, Deployment > Build Tools > Maven.
В поле
Maven home path выберите путь к системной установке (например, C:\Program Files\Apache\maven-3.8.6 или /opt/apache-maven-3.8.6).
Перезапустите проект для применения изменений.



Почему встроенный
Maven заменяет системный:
Удобство: Встроенный Maven не требует установки, что упрощает начало работы.
Совместимость: IDEA гарантирует совместимость встроенного
Maven с функциями IDE (например, автодополнение в POM.xml, интеграция с dependency:tree).
Изоляция: Встроенный
Maven изолирован от системных изменений (например, обновления системного Maven), обеспечивая стабильность.
Кэширование: IDEA использует тот же локальный репозиторий (~/.m2/repository), что и системный
Maven, минимизируя дублирование данных.


Когда использовать системный Maven:
Для согласованности с CI/CD, где требуется конкретная версия Maven.
При использовании
Maven Wrapper (mvnw), который игнорирует встроенный Maven.
Для кастомных расширений или плагинов, требующих специфической версии
Maven.
При работе в терминале или на серверах без IDE.


В памяти: Системный Maven запускается как отдельный процесс, что изолирует его от памяти IDEA, но требует дополнительных ресурсов для запуска JVM. Встроенный Maven экономит ресурсы, так как работает в той же JVM, но может конфликтовать с другими задачами IDE.


Нюансы интеграции

Конфликты версий: Если системный и встроенный Maven используют разные версии, могут возникнуть несовместимости в поведении плагинов или разрешении зависимостей. Используйте mvnw или настройте IDEA на системный Maven.
Настройки: Встроенный
Maven использует ~/.m2/settings.xml, если он существует, но IDEA позволяет переопределить настройки через интерфейс.
Производительность: Встроенный
Maven может быть медленнее в IDE из-за конкуренции за ресурсы JVM. Для крупных проектов рекомендуется системный Maven с -T для параллельной сборки.
Отладка: IDEA предоставляет графический интерфейс для выполнения
Maven-целей (Run > Maven > Lifecycle), но для детальной отладки используйте терминал с -X или -e.

#Java #middle #Maven_In_IntelljIDEA
👍3
Нюансы и внутренние механизмы

Управление памятью:
Maven загружает модель POM, зависимости и плагины в память JVM. Для крупных проектов с сотнями зависимостей потребление памяти может достигать нескольких гигабайт.
Встроенный
Maven в IDEA разделяет память с IDE, что может привести к перегрузке при выполнении ресурсоемких задач (например, компиляция или тестирование).
Системный
Maven запускается отдельно, что изолирует его, но увеличивает общее потребление памяти системы.
Оптимизируйте с помощью JVM-флагов: -Xmx2048m для увеличения кучи.

Кэширование:
Локальный репозиторий (~/.m2/repository) используется обоими вариантами Maven, минимизируя дублирование артефактов.
Встроенный
Maven в IDEA кэширует результаты сборки в памяти IDE, что ускоряет повторные операции, но увеличивает нагрузку на JVM.

Совместимость:

Убедитесь, что версия JDK, указанная в JAVA_HOME, совместима с Maven (например, Maven 3.8.6 требует JDK 7+).
Разные версии
Maven могут по-разному интерпретировать POM.xml. Используйте mvnw для согласованности.

Безопасность:
Храните учетные данные для репозиториев в зашифрованном виде в ~/.m2/settings-security.xml.
Ограничьте доступ к ~/.m2 на Linux: chmod 700 ~/.m2.


Отладка:
Используйте mvn -X для вывода подробных логов о загрузке плагинов и зависимостей.
В IDEA откройте вкладку "Maven" для выполнения целей и анализа вывода.
Проверьте итоговую конфигурацию: mvn help:effective-pom или mvn help:effective-settings.

Производительность:
Системный Maven позволяет использовать флаг -T для параллельной сборки, что быстрее для многомодульных проектов.
Встроенный
Maven в IDEA может быть ограничен настройками JVM IDE. Настройте idea64.exe.vmoptions для увеличения памяти.

#Java #middle #Maven_In_IntelljIDEA
👍3
Подробная инструкция по установке Maven на Windows


Зачем устанавливать Maven

Установка Maven на систему необходима по следующим причинам:
Автоматизация сборки: Maven предоставляет стандартизированный жизненный цикл для компиляции, тестирования, упаковки и развертывания проектов.
Управление зависимостями:
Maven автоматически загружает библиотеки из репозиториев (например, Maven Central), упрощая управление зависимостями.
CI/CD-интеграция: CI/CD-системы (Jenkins, GitLab CI, GitHub Actions) требуют системной установки
Maven для выполнения сборок.
Независимость от IDE: Системный
Maven позволяет запускать команды (mvn clean install) из терминала, что полезно для серверов или скриптов.
Контроль версий: Системная установка позволяет использовать конкретную версию
Maven, обеспечивая воспроизводимость сборок.
Кастомизация: Системный
Maven дает полный контроль над настройками через settings.xml и поддерживает расширения.

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


Установка Maven на Windows

Требования
JDK: Установленный Java Development Kit (версия 8 или выше, рекомендуется OpenJDK или Oracle JDK).
Интернет: Для загрузки
Maven и зависимостей.
Права администратора: Для настройки переменных окружения (опционально).


Шаги установки

Проверка JDK:

Убедитесь, что JDK установлен:
java -version

Вывод должен показать версию Java (например, openjdk 11.0.16). Если JDK отсутствует, скачайте и установите с Adoptium или Oracle.


Скачивание Maven:
Перейдите на официальный сайт Apache Maven.
Скачайте бинарный архив, например,
apache-maven-3.9.9-bin.zip.
Распакуйте архив в удобную директорию, например, C:\Program Files\Apache\
maven-3.9.9.

Настройка переменных окружения:
Откройте "Свойства системы".
Нажмите Win + R, введите sysdm.cpl и нажмите Enter.
Перейдите на вкладку "Дополнительно" → "Переменные среды".


Создайте переменную M2_HOME:
В разделе "Системные переменные" нажмите "Создать".
Имя: M2_HOME, Значение: C:\Program Files\Apache\
maven-3.9.9.

Добавьте Maven в PATH:
Найдите переменную Path в "Системных переменных" и добавьте %M2_HOME%\bin.

Проверьте переменную JAVA_HOME:
Убедитесь, что JAVA_HOME указывает на директорию JDK, например, C:\Program Files\Java\jdk-11.0.16.
Если отсутствует, создайте: Имя: JAVA_HOME, Значение: C:\Program Files\Java\jdk-11.0.16.

Проверка установки:
Откройте командную строку (Win + R → cmd).

Выполните:
mvn -version


Вывод должен показать версию Maven, Java и другие детали:
Apache Maven 3.8.6
Maven home: C:\Program Files\Apache\maven-3.8.6
Java version: 11.0.16, vendor: Adoptium



Настройка локального репозитория:
По умолчанию Maven использует ~/.m2/repository (например, C:\Users\<username>\.m2\repository) для кэширования зависимостей.

Опционально настройте settings.xml в C:\Users\<username>\.m2 для указания зеркал, прокси или профилей:
<settings>
<localRepository>C:/custom/m2/repository</localRepository>
</settings>

В памяти: При запуске Maven загружает mvn.bat (или mvn.cmd), который вызывает Java-процесс. JVM загружает Maven Core, плагины и зависимости в оперативную память. Локальный репозиторий минимизирует сетевые запросы, но может занимать значительное место на диске.


Нюансы:
Убедитесь, что JAVA_HOME указывает на JDK, а не JRE, иначе Maven не сможет компилировать код.
Если mvn не распознается, проверьте правильность PATH.
Используйте
Maven Wrapper (mvnw) в проектах для независимости от системной версии.

#Java #middle #Maven #Maven_install
👍6
Установка Maven на Linux

Требования
JDK: Установленный JDK (версия 8 или выше).
Интернет: Для загрузки
Maven.
Терминал: Доступ к командной строке.



Шаги установки

Проверка JDK:
Выполните:
java -version


Вывод должен показать версию Java. Если JDK отсутствует, установите, например, OpenJDK:
sudo apt update
sudo apt install openjdk-11-jdk # Ubuntu/Debian
sudo dnf install java-11-openjdk-devel # Fedora


Скачивание Maven:
Перейдите на сайт Apache Maven.

Скачайте архив, например, apache-maven-3.9.9-bin.tar.gz:
wget https://downloads.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz


Распакуйте в /opt:
sudo tar -xzvf apache-maven-3.9.9-bin.tar.gz -C /opt


Настройка переменных окружения:
Откройте файл /etc/environment или ~/.bashrc:
nano ~/.bashrc


Добавьте строки:
export M2_HOME=/opt/apache-maven-3.9.9
export PATH=$M2_HOME/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 # Путь к JDK


Примените изменения:
source ~/.bashrc


Проверка установки:
Выполните:
mvn -version


Вывод:

Apache Maven 3.9.9
Maven home: /opt/apache-maven-3.9.9
Java version: 11.0.16, vendor: Ubuntu


Настройка локального репозитория:
По умолчанию используется ~/.m2/repository.

Опционально настройте ~/.m2/settings.xml для кастомного пути или зеркал:
<settings>
<localRepository>/custom/m2/repository</localRepository>
</settings>

В памяти: На Linux Maven запускается через скрипт mvn, который вызывает JVM. Процесс аналогичен Windows: Maven Core, плагины и зависимости загружаются в память. Локальный репозиторий кэширует артефакты, снижая сетевую нагрузку.


Нюансы:
Убедитесь, что JAVA_HOME указывает на правильный JDK.
Для системного доступа установите
Maven в /opt и настройте права: sudo chown -R $USER /opt/apache-maven-3.9.9.
Используйте mvnw для согласованности версий в проектах.


#Java #middle #Maven #Maven_install
👍3