1. Обзор
При использовании Maven мы сохраняем большую часть конфигурации для конкретного проекта в файле pom.xml
.
Maven предоставляет файл настроек settings.xml,
который позволяет нам указать, какие локальные и удаленные репозитории он будет использовать. Мы также можем использовать его для хранения настроек, которые нам не нужны в нашем исходном коде, таких как учетные данные.
В этом руководстве мы узнаем, как использовать файл settings.xml
. Мы рассмотрим прокси, зеркалирование и профили. Мы также обсудим, как определить текущие настройки, применимые к нашему проекту.
2. Конфигурации
Файл settings.xml
настраивает установку Maven . Он похож на файл pom.xml
, но определяется глобально или для каждого пользователя.
Давайте рассмотрим элементы, которые мы можем настроить в файле settings.xml
. Основной элемент настроек файла
settings.xml
может содержать девять возможных предопределенных дочерних элементов:
<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/>
<interactiveMode/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors/>
<proxies/>
<profiles/>
<activeProfiles/>
</settings>
2.1. Простые значения
Некоторые из элементов конфигурации верхнего уровня содержат простые значения:
<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>${user.home}/.m2/repository</localRepository>
<interactiveMode>true</interactiveMode>
<offline>false</offline>
</settings>
Элемент localRepository
указывает путь к локальному репозиторию системы. В локальном репозитории кэшируются все зависимости от наших проектов . По умолчанию используется домашний каталог пользователя. Однако мы могли бы изменить его, чтобы разрешить всем вошедшим в систему пользователям выполнять сборку из общего локального репозитория.
Флаг InteractiveMode определяет, разрешаем ли мы Maven взаимодействовать
с пользователем, запрашивающим ввод. Этот флаг по умолчанию имеет значение true
.
Флаг автономного
режима определяет, может ли система сборки работать в автономном режиме. По умолчанию это значение false;
однако мы можем переключить его на true
в тех случаях, когда серверы сборки не могут подключиться к удаленному репозиторию.
2.2. Группы плагинов
Элемент pluginGroups
содержит список дочерних элементов, у которых указан groupId
. GroupId — это
уникальный идентификатор организации, создавшей определенный артефакт 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">
<pluginGroups>
<pluginGroup>org.apache.tomcat.maven</pluginGroup>
</pluginGroups>
</settings>
Maven выполняет поиск в списке групп подключаемых модулей, когда подключаемый модуль используется без идентификатора группы, указанного в командной строке . Список содержит группы org.apache.maven.plugins
и org.codehaus.mojo
по умолчанию.
Определенный выше файл settings.xml
позволяет нам выполнять усеченные команды подключаемого модуля Tomcat:
mvn tomcat7:help
mvn tomcat7:deploy
mvn tomcat7:run
2.3. Прокси
Мы можем настроить прокси для некоторых или всех HTTP-запросов 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">
<proxies>
<proxy>
<id>foreach-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>foreach.proxy.com</host>
<port>8080</port>
<username>demo-user</username>
<password>dummy-password</password>
<nonProxyHosts>*.foreach.com|*.apache.org</nonProxyHosts>
</proxy>
</proxies>
</settings>
Мы определяем текущий активный прокси через активный
флаг. Затем с помощью элемента nonProxyHosts
мы указываем, какие хосты не проксируются. Используемый разделитель зависит от конкретного прокси-сервера. Наиболее распространенными разделителями являются вертикальная черта и запятая.
2.4. Зеркала
Репозитории могут быть объявлены внутри проекта pom.xml.
Это означает, что `` разработчики, совместно использующие код проекта, получают нужные настройки репозитория из коробки.
Мы можем использовать зеркала в тех случаях, когда мы хотим определить альтернативное зеркало для определенного репозитория . Это переопределяет то, что находится в pom.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">
<mirrors>
<mirror>
<id>internal-foreach-repository</id>
<name>ForEach Internal Repo</name>
<url>https://foreach.com/repo/maven2/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
</settings>
Мы можем определить только одно зеркало для данного репозитория, и Maven выберет первое совпадение. Обычно мы должны использовать официальный репозиторий , распространяемый по всему миру через CDN.
2.5. Серверы
Определение репозиториев в проекте pom.xml
является хорошей практикой. Однако мы не должны помещать параметры безопасности, такие как учетные данные, в наш репозиторий исходного кода с pom.xml
. Вместо этого мы определяем эту безопасную информацию в файле settings.xml
:
<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">
<servers>
<server>
<id>internal-foreach-repository</id>
<username>demo-user</username>
<password>dummy-password</password>
<privateKey>${user.home}/.ssh/bael_key</privateKey>
<passphrase>dummy-passphrase</passphrase>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
<configuration></configuration>
</server>
</servers>
</settings>
Следует отметить, что идентификатор
сервера в settings.xml
должен соответствовать элементу идентификатора
репозитория, указанному в pom.xml
. XML также позволяет нам использовать заполнители для получения учетных данных из переменных среды.
3. Профили
Элемент profiles
позволяет нам создавать несколько дочерних элементов профиля
, отличающихся своим идентификатором
дочернего элемента. Элемент profile
в settings.xml
представляет собой усеченную версию того же элемента, доступного в pom.xml
.
Он может содержать только четыре дочерних элемента: активация
, репозитории
, pluginRepositories
и properties.
Эти элементы настраивают систему сборки в целом, а не какой-либо конкретный проект.
Важно отметить, что значения из активного профиля в settings.xml
переопределяют любые эквивалентные значения профиля в файле
pom.xml или profiles.xml
. Профили сопоставляются по ID
.
3.1. Активация
Мы можем использовать профили для изменения определенных значений только при определенных обстоятельствах. Мы можем указать эти обстоятельства, используя элемент активации .
Следовательно, активация профиля происходит при соблюдении всех указанных критериев :
<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">
<profiles>
<profile>
<id>foreach-test</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.8</jdk>
<os>
<name>Windows 10</name>
<family>Windows</family>
<arch>amd64</arch>
<version>10.0</version>
</os>
<property>
<name>mavenVersion</name>
<value>3.0.7</value>
</property>
<file>
<exists>${basedir}/activation-file.properties</exists>
<missing>${basedir}/deactivation-file.properties</missing>
</file>
</activation>
</profile>
</profiles>
</settings>
Есть четыре возможных активатора, и не все из них нужно указывать:
jdk:
активируется на основе указанной версии JDK (поддерживаются диапазоны)os:
активируется на основе свойств операционной системысвойство:
активирует профиль, если Maven обнаруживает определенное значение свойствафайл:
активирует профиль, если данное имя файла существует или отсутствует
Чтобы проверить, какой профиль активирует определенную сборку, мы можем использовать плагин справки Maven:
mvn help:active-profiles
На выходе будут отображаться текущие активные профили для данного проекта:
[INFO] --- maven-help-plugin:3.2.0:active-profiles (default-cli) @ core-java-streams-3 ---
[INFO]
Active Profiles for Project 'com.foreach.core-java-modules:core-java-streams-3:jar:0.1.0-SNAPSHOT':
The following profiles are active:
- foreach-test (source: com.foreach.core-java-modules:core-java-streams-3:0.1.0-SNAPSHOT)
3.2. Характеристики
Свойства Maven можно рассматривать как именованные заполнители для определенного значения. Значения доступны в файле pom.xml
с использованием нотации ${property_name}
:
<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">
<profiles>
<profile>
<id>foreach-test</id>
<properties>
<user.project.folder>${user.home}/foreach-tutorials</user.project.folder>
</properties>
</profile>
</profiles>
</settings>
В файлах pom.xml
доступны четыре различных типа свойств :
- Свойства, использующие префикс
env
, возвращают значение переменной среды, например${env.
ДОРОЖКА}. - Свойства, использующие префикс
проекта
, возвращают значение свойства, установленное в элементе проектаpom.xml
,
например${project.version}.
- Свойства, использующие префикс
settings
, возвращают значение соответствующего элемента изsettings.xml
, например${settings.localRepository}.
- Мы можем напрямую ссылаться на все свойства, доступные через метод
System.getProperties
в Java, например${java.home}.
- Мы можем использовать набор свойств внутри элемента
properties
без префикса, например${junit.version}.
3.3. Репозитории
Удаленные репозитории содержат коллекции артефактов, которые Maven использует для заполнения нашего локального репозитория. Для определенных артефактов могут потребоваться разные удаленные репозитории. 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">
<profiles>
<profile>
<id>adobe-public</id>
<repositories>
<repository>
<id>adobe-public-releases</id>
<name>Adobe Public Repository</name>
<url>https://repo.adobe.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
</settings>
Мы можем использовать элемент репозитория
, чтобы включить только выпуски или моментальные снимки артефактов из определенного репозитория.
3.4. Репозитории плагинов
Существует два стандартных типа артефактов Maven: зависимости и плагины. Поскольку плагины 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">
<profiles>
<profile>
<id>adobe-public</id>
<pluginRepositories>
<pluginRepository>
<id>adobe-public-releases</id>
<name>Adobe Public Repository</name>
<url>https://repo.adobe.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</settings>
Примечательно, что структура элемента pluginRepositories
очень похожа на элемент repositories .
3.5. Активные профили
Элемент activeProfiles
содержит дочерние элементы, которые относятся к определенному идентификатору
профиля . 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">
<activeProfiles>
<activeProfile>foreach-test</activeProfile>
<activeProfile>adobe-public</activeProfile>
</activeProfiles>
</settings>
В этом примере каждый вызов mvn
выполняется так, как если бы мы добавили -P foreach-test,adobe-public
в командную строку.
4. Уровень настроек
Файл settings.xml
обычно находится в нескольких местах:
- Глобальные настройки в домашнем каталоге Mavens:
${maven.home}/conf/settings.xml
- Настройки пользователя в доме пользователя:
${user.home}/.m2/settings.xml
Если оба файла существуют, их содержимое объединяется. Конфигурации из пользовательских настроек имеют приоритет .
4.1. Определить местоположение файла
Чтобы определить расположение глобальных и пользовательских настроек, мы можем запустить Maven, используя флаг отладки, и искать «настройки»
в выводе:
$ mvn -X clean | grep "settings"
[DEBUG] Reading global settings from C:\Program Files (x86)\Apache\apache-maven-3.6.3\bin\..\conf\settings.xml
[DEBUG] Reading user settings from C:\Users\ForEach\.m2\settings.xml
4.2. Определите эффективные настройки
Мы можем использовать плагин справки Maven, чтобы узнать содержимое объединенных глобальных и пользовательских настроек :
mvn help:effective-settings
Это описывает настройки в формате XML:
<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>C:\Users\ForEach\.m2\repository</localRepository>
<pluginGroups>
<pluginGroup>org.apache.tomcat.maven</pluginGroup>
<pluginGroup>org.apache.maven.plugins</pluginGroup>
<pluginGroup>org.codehaus.mojo</pluginGroup>
</pluginGroups>
</settings>
4.3. Переопределить местоположение по умолчанию
Maven также позволяет нам переопределить расположение глобальных и пользовательских настроек через командную строку:
$ mvn clean --settings c:\user\user-settings.xml --global-settings c:\user\global-settings.xml
Мы также можем использовать более короткую версию той же команды –s :
$ mvn clean --s c:\user\user-settings.xml --gs c:\user\global-settings.xml
5. Вывод
В этой статье мы рассмотрели конфигурации, доступные в файле Maven settings.xml
.
Мы научились настраивать прокси, репозитории и профили. Далее мы рассмотрели разницу между файлами глобальных и пользовательских настроек и то, как определить, какие из них используются.
Наконец, мы рассмотрели определение используемых эффективных настроек и переопределение расположения файлов по умолчанию.