Gymterview
middle

Как настроить Maven для работы с Nexus?

Настройка Maven для Nexus — это конфигурация двух файлов: settings.xml (учётные данные и зеркала) и pom.xml (адреса для публикации артефактов), обеспечивающая скачивание зависимостей из Nexus и загрузку артефактов в Nexus.

Общая схема

Пример
settings.xml (credentials + mirror)  →  Maven  →  Nexus (maven-public)
pom.xml (distributionManagement)     →  Maven  →  Nexus (maven-releases / maven-snapshots)

1. Файл settings.xml

Обычно располагается в ~/.m2/settings.xml или предоставляется Jenkins через Config File Provider.

Полный пример settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0
          https://maven.apache.org/xsd/settings-1.2.0.xsd">

    <!-- Учетные данные для Nexus -->
    <servers>
        <server>
            <id>nexus-releases</id>
            <username>${env.NEXUS_USER}</username>
            <password>${env.NEXUS_PASS}</password>
        </server>
        <server>
            <id>nexus-snapshots</id>
            <username>${env.NEXUS_USER}</username>
            <password>${env.NEXUS_PASS}</password>
        </server>
    </servers>

    <!-- Зеркало: все запросы идут через Nexus -->
    <mirrors>
        <mirror>
            <id>nexus</id>
            <mirrorOf>*</mirrorOf>
            <url>https://nexus.company.com/repository/maven-public/</url>
        </mirror>
    </mirrors>

    <profiles>
        <profile>
            <id>nexus</id>
            <repositories>
                <repository>
                    <id>nexus-public</id>
                    <url>https://nexus.company.com/repository/maven-public/</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>true</enabled></snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>nexus-public</id>
                    <url>https://nexus.company.com/repository/maven-public/</url>
                </pluginRepository>
            </pluginRepositories>
        </profile>
    </profiles>

    <activeProfiles>
        <activeProfile>nexus</activeProfile>
    </activeProfiles>
</settings>

2. Файл pom.xml — секция distributionManagement

Определяет, куда Maven будет публиковать артефакты при выполнении mvn deploy:

Пример
<distributionManagement>
    <repository>
        <id>nexus-releases</id>
        <name>Nexus Releases</name>
        <url>https://nexus.company.com/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>nexus-snapshots</id>
        <name>Nexus Snapshots</name>
        <url>https://nexus.company.com/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

Связь между settings.xml и pom.xml

Значения <id> в distributionManagement (pom.xml) должны совпадать с <id> в <servers> (settings.xml) — так Maven понимает, какие учётные данные использовать для конкретного репозитория.

Пример
pom.xml:  <id>nexus-releases</id>   ←→   settings.xml: <server><id>nexus-releases</id>

Команда для публикации

Пример
mvn deploy -s /path/to/settings.xml

Использование в Jenkins

Пример
stage('Deploy to Nexus') {
    steps {
        configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
            sh 'mvn deploy -DskipTests -s $MAVEN_SETTINGS'
        }
    }
}

Вывод

Настройка Maven-Nexus сводится к трём вещам: учётные данные в settings.xml, зеркало для скачивания зависимостей и distributionManagement в pom.xml для публикации. Главное — совпадение <id> между файлами.

На собеседовании: могут спросить, где хранить учётные данные для Nexus. Правильный ответ: никогда в pom.xml (он коммитится в Git). Только в settings.xml, который предоставляется через Jenkins Config File Provider или через переменные окружения.