Какую роль выполняют профили (profiles) в Maven?

Ответ

Профили в Maven позволяют настраивать сборку проекта для разных сред (development, testing, production) без дублирования кода в pom.xml. Они активируются автоматически (по условиям) или вручную через командную строку.

Основные сценарии использования:

  1. Разные конфигурации для сред:

    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <database.url>jdbc:h2:mem:test</database.url>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <database.url>jdbc:mysql://prod-db:3306/app</database.url>
            </properties>
        </profile>
    </profiles>
  2. Условная активация профиля (например, по переменной окружения):

    <profile>
        <id>ci</id>
        <activation>
            <property>
                <name>env.CI</name>
                <value>true</value>
            </property>
        </activation>
        <!-- Настройки для CI-сервера -->
    </profile>
  3. Включение/исключение модулей или плагинов:

    <profile>
        <id>with-docs</id>
        <modules>
            <module>documentation</module>
        </modules>
    </profile>

Активация профиля:

# Активация вручную
mvn clean install -P dev,prod

# Активация по свойству
mvn clean install -Denv=production

Преимущества: Изоляция конфигураций, гибкость сборки, упрощение CI/CD-пайплайнов.

Ответ 18+ 🔞

А, профили в Mейвене, блядь! Ну это ж просто пиздец как удобно, когда у тебя один проект, а собирать его надо в трёх разных местах: у себя на компе, на каком-нибудь сервере для тестов и, собственно, на боевом, где всё горит и падает.

Вот смотри, представь: пишешь ты код, и тебе надо базу данных. На своей машине ты, понятное дело, поставил какую-нибудь лёгкую хуйню в память, чтобы не париться. А на продакшене стоит здоровенный MySQL, который ещё и на другом сервере торчит. И что, каждый раз в pom.xml лазить и строки подключения менять? Да ну нахуй, ёпта! Для этого и придумали профили.

Смысл в чём: ты в одном файле описываешь кучу разных конфигураций, как будто несколько pom.xml в одном. А потом при сборке говоришь: «Мейвен, активируй-ка мне вот этот профиль, я сегодня в настроении для разработки». И он подставляет нужные настройки.

Вот, смотри, как это выглядит, простейший пример:

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <database.url>jdbc:h2:mem:test</database.url>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <database.url>jdbc:mysql://prod-db:3306/app</database.url>
        </properties>
    </profile>
</profiles>

Видишь? Один профиль dev — для разработки, база в памяти. Другой prod — для прода, там уже серьёзный адрес. Красота, блядь!

А ещё можно сделать так, чтобы профиль сам включался, без твоего ведома. Например, если система видит, что сборка запущена на CI-сервере (типа Jenkins или GitHub Actions). Это называется условная активация, и делается через <activation>.

<profile>
    <id>ci</id>
    <activation>
        <property>
            <name>env.CI</name>
            <value>true</value>
        </property>
    </activation>
    <!-- Настройки для CI-сервера -->
</profile>

То есть, если есть переменная окружения CI=true, то профиль ci сам активируется, как по волшебству. Удобно, ёпта!

Ну и, конечно, можно целые модули проекта включать или выключать. Скажем, у тебя есть отдельный модуль с документацией, который собирается овердохуища долго. Зачем он тебе каждый раз? Выносишь его в отдельный профиль with-docs и включаешь только когда надо.

<profile>
    <id>with-docs</id>
    <modules>
        <module>documentation</module>
    </modules>
</profile>

Как этим пользоваться? Да элементарно, в рот меня чих-пых!

# Активация вручную (через -P). Хочешь два сразу — пожалуйста.
mvn clean install -P dev,prod

# Или активируй через системное свойство (через -D)
mvn clean install -Denv=production

Вот и вся магия. Преимущества очевидны, даже дурак поймёт: конфиги не смешиваются в одну кучу, сборка становится гибкой как хуй в бане, а в этих ваших CI/CD-пайплайнах вообще красота — для каждого этапа свой профиль. И никакого говнокода с дублированием настроек!