- Home »

Шпаргалка по командам и опциям Maven
Если ты развертываешь приложения на Java и администрируешь серверы, то наверняка сталкивался с Maven. Эта штука может превратить твою жизнь в рай автоматизации или в настоящий ад, если не знать, как с ней обращаться. Сегодня разберём все основные команды и опции Maven, которые реально нужны в продакшене, плюс несколько трюков, которые сэкономят тебе кучу времени при настройке CI/CD пайплайнов и деплойменте на сервера.
Maven — это не просто система сборки, это целая экосистема управления проектами, которая может автоматизировать практически все процессы от компиляции до деплоя. Знание его команд и опций критично для любого, кто работает с Java-приложениями на серверах.
Как работает Maven: основы для серверных задач
Maven работает по принципу “соглашения вместо конфигурации”. У него есть стандартный жизненный цикл сборки с фазами: validate, compile, test, package, verify, install, deploy. Каждая фаза выполняет определенные задачи, и ты можешь запускать их по отдельности или цепочкой.
Основные концепции:
- POM (Project Object Model) — файл pom.xml содержит всю конфигурацию проекта
- Репозитории — локальный (~/.m2/repository) и удаленные (Maven Central, корпоративные Nexus/Artifactory)
- Плагины — расширяют функциональность Maven
- Профили — позволяют настраивать разные конфигурации для разных сред
Основные команды Maven: полный список
Вот список команд, которые реально используются в серверной разработке:
# Основные команды жизненного цикла
mvn clean # Очистка target директории
mvn compile # Компиляция исходного кода
mvn test # Запуск тестов
mvn package # Создание JAR/WAR файла
mvn install # Установка артефакта в локальный репозиторий
mvn deploy # Деплой в удаленный репозиторий
# Комбинированные команды (самые популярные)
mvn clean compile # Очистка + компиляция
mvn clean test # Очистка + тесты
mvn clean package # Очистка + создание пакета
mvn clean install # Очистка + установка в локальный репозиторий
mvn clean deploy # Очистка + деплой
# Пропуск тестов (для быстрой сборки)
mvn clean package -DskipTests # Пропустить выполнение тестов
mvn clean package -Dmaven.test.skip=true # Пропустить компиляцию и выполнение тестов
# Работа с профилями
mvn clean package -Pproduction # Активация профиля production
mvn clean package -Pdev,testing # Активация нескольких профилей
# Отладка и диагностика
mvn dependency:tree # Показать дерево зависимостей
mvn dependency:resolve # Разрешить все зависимости
mvn help:effective-pom # Показать итоговый POM
mvn help:active-profiles # Показать активные профили
mvn versions:display-dependency-updates # Показать устаревшие зависимости
# Очистка и обновление
mvn dependency:purge-local-repository # Очистить локальный репозиторий
mvn clean install -U # Принудительное обновление snapshot зависимостей
# Запуск приложения
mvn spring-boot:run # Запуск Spring Boot приложения
mvn exec:java # Запуск Java класса
mvn jetty:run # Запуск с Jetty сервером
mvn tomcat7:run # Запуск с Tomcat
# Генерация проектов
mvn archetype:generate # Создание нового проекта из архетипа
mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Полезные опции и параметры
Эти опции сильно упрощают работу с Maven в серверных окружениях:
# Основные опции
-q, --quiet # Тихий режим (минимум логов)
-X, --debug # Подробный вывод для отладки
-e, --errors # Показать стектрейсы ошибок
-f, --file # Указать путь к pom.xml
-o, --offline # Офлайн режим (без загрузки зависимостей)
-U, --update-snapshots # Принудительно обновить SNAPSHOT зависимости
-T, --threads # Количество потоков для параллельной сборки
-P, --activate-profiles # Активировать профили
-D, --define # Установить системное свойство
# Примеры использования
mvn clean install -q # Тихая сборка
mvn clean package -T 4 # Сборка в 4 потока
mvn clean install -o # Офлайн сборка
mvn clean package -DskipTests=true -q # Быстрая сборка без тестов
mvn clean install -Dmaven.repo.local=/tmp/repo # Кастомный локальный репозиторий
Настройка Maven для серверной среды
При работе с серверами важно правильно настроить Maven. Вот пошаговая настройка:
1. Настройка settings.xml
Файл ~/.m2/settings.xml — это глобальная конфигурация Maven:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>/opt/maven/repository</localRepository>
<servers>
<server>
<id>nexus-releases</id>
<username>${env.NEXUS_USERNAME}</username>
<password>${env.NEXUS_PASSWORD}</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>central</mirrorOf>
<url>https://nexus.company.com/repository/maven-public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>production</id>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.test.skip>true</maven.test.skip>
</properties>
</profile>
</profiles>
</settings>
2. Настройка переменных окружения
# .bashrc или .profile
export M2_HOME=/opt/maven
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$MAVEN_HOME/bin
export MAVEN_OPTS="-Xmx2048m -XX:MaxPermSize=512m"
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
Практические кейсы и примеры
Кейс 1: Автоматизация деплоя на сервер
Создаем профиль для продакшена в pom.xml:
<profiles>
<profile>
<id>production</id>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
<maven.test.skip>true</maven.test.skip>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Скрипт деплоя:
#!/bin/bash
# deploy.sh
APP_NAME="my-app"
VERSION="1.0.0"
DEPLOY_DIR="/opt/apps/${APP_NAME}"
SERVICE_NAME="${APP_NAME}.service"
# Сборка
mvn clean package -Pproduction -DskipTests
# Остановка сервиса
sudo systemctl stop ${SERVICE_NAME}
# Копирование файлов
sudo cp target/${APP_NAME}-${VERSION}.jar ${DEPLOY_DIR}/app.jar
# Запуск сервиса
sudo systemctl start ${SERVICE_NAME}
sudo systemctl status ${SERVICE_NAME}
Кейс 2: Многомодульный проект
Для больших проектов используем многомодульную структуру:
# Сборка всех модулей
mvn clean install
# Сборка только конкретного модуля
mvn clean install -pl module-name
# Сборка модуля и его зависимостей
mvn clean install -pl module-name -am
# Сборка всех модулей, которые зависят от данного
mvn clean install -pl module-name -amd
Сравнение с другими системами сборки
Критерий | Maven | Gradle | Ant |
---|---|---|---|
Простота изучения | Средняя | Сложная | Простая |
Скорость сборки | Средняя | Высокая | Низкая |
Управление зависимостями | Отличное | Отличное | Нет |
Размер сообщества | Огромное | Большое | Среднее |
Подходит для больших проектов | Да | Да | Нет |
Оптимизация Maven для серверов
При работе на серверах важно оптимизировать Maven для лучшей производительности:
1. Параллельная сборка
# Использовать все доступные ядра
mvn clean install -T 1C
# Использовать 4 потока
mvn clean install -T 4
# Для многомодульных проектов
mvn clean install -T 4 -Dmaven.compile.fork=true
2. Кэширование зависимостей
# Настройка в .mvn/maven.config
-Dmaven.repo.local=/shared/maven/repository
-Dmaven.artifact.threads=10
3. Оптимизация JVM
# .mavenrc
export MAVEN_OPTS="-Xmx4g -XX:+UseG1GC -XX:+UseStringDeduplication"
Интеграция с CI/CD и автоматизация
Maven отлично интегрируется с системами непрерывной интеграции:
Jenkins Pipeline
pipeline {
agent any
tools {
maven 'Maven-3.8.6'
jdk 'OpenJDK-11'
}
stages {
stage('Build') {
steps {
sh 'mvn clean compile'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Package') {
steps {
sh 'mvn package -DskipTests'
}
}
stage('Deploy') {
when {
branch 'master'
}
steps {
sh 'mvn deploy -DskipTests'
}
}
}
}
GitHub Actions
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
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: Cache Maven packages
uses: actions/cache@v3
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
- name: Build with Maven
run: mvn clean package -DskipTests
- name: Run tests
run: mvn test
Полезные плагины для серверной разработки
Вот список плагинов, которые реально экономят время:
# Dockerfile Maven Plugin - для контейнеризации
mvn dockerfile:build
mvn dockerfile:push
# Spring Boot Plugin - для Spring приложений
mvn spring-boot:run
mvn spring-boot:build-image
# Flyway Plugin - для миграций БД
mvn flyway:migrate
mvn flyway:clean
# Versions Plugin - для управления версиями
mvn versions:display-dependency-updates
mvn versions:use-latest-versions
# Sonarqube Plugin - для анализа кода
mvn sonar:sonar
# Jacoco Plugin - для покрытия тестами
mvn jacoco:report
Нестандартные способы использования
Несколько трюков, которые мало кто знает:
1. Создание собственного архетипа
# Создать архетип из существующего проекта
mvn archetype:create-from-project
# Установить архетип локально
cd target/generated-sources/archetype
mvn install
# Использовать собственный архетип
mvn archetype:generate -DarchetypeGroupId=com.company -DarchetypeArtifactId=custom-archetype
2. Выполнение произвольных команд
# Запуск произвольной Java программы
mvn exec:java -Dexec.mainClass="com.example.Main" -Dexec.args="arg1 arg2"
# Выполнение shell команд
mvn exec:exec -Dexec.executable="bash" -Dexec.args="-c 'echo Hello World'"
3. Условная сборка
# Активация профиля в зависимости от OS
mvn clean package -P linux
mvn clean package -P windows
# Активация профиля в зависимости от переменной окружения
mvn clean package -P${ENV}
Диагностика и решение проблем
Часто встречающиеся проблемы и их решения:
# Проблема: OutOfMemoryError
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512m"
# Проблема: Медленная сборка
mvn clean install -T 4 -o
# Проблема: Конфликты зависимостей
mvn dependency:tree -Dverbose
mvn dependency:analyze
# Проблема: Проблемы с сетью
mvn clean install -Dmaven.wagon.http.retryHandler.count=3
# Проблема: Поврежденные зависимости
mvn dependency:purge-local-repository
rm -rf ~/.m2/repository
Безопасность и best practices
- Не храни пароли в pom.xml — используй переменные окружения или settings.xml
- Регулярно обновляй зависимости — используй mvn versions:display-dependency-updates
- Проверяй уязвимости — используй OWASP dependency-check плагин
- Используй корпоративные репозитории — Nexus или Artifactory для контроля зависимостей
- Версионируй все — избегай SNAPSHOT зависимостей в продакшене
Для деплоя Maven-приложений на серверах рекомендую использовать качественные VPS с SSD дисками — аренда VPS или выделенные серверы для крупных проектов.
Заключение и рекомендации
Maven — это мощный инструмент, который при правильной настройке может значительно упростить работу с Java-проектами на серверах. Основные рекомендации:
- Изучи жизненный цикл — понимание фаз поможет оптимизировать процесс сборки
- Настрой профили — для разных окружений (dev, test, prod)
- Используй параллельную сборку — экономит время на многоядерных серверах
- Автоматизируй все — интегрируй Maven в CI/CD пайплайны
- Мониторь зависимости — регулярно обновляй и проверяй на уязвимости
Помни: Maven — это не просто инструмент сборки, это целая экосистема, которая может автоматизировать практически все аспекты работы с Java-проектами. Потрать время на изучение его возможностей, и он окупится многократно в виде сэкономленного времени и стабильности деплоймента.
Полезные ссылки для дальнейшего изучения:
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.