## Settings Reference

1.  [Introduction](#Introduction)
    1.  [Quick Overview](#Quick_Overview)

2.  [Settings Details](#Settings_Details)
    1.  [Simple Values](#Simple_Values)
    2.  [Plugin Groups](#Plugin_Groups)
    3.  [Servers](#Servers)
        1.  [Password Encryption](#Password_Encryption)

    4.  [Mirrors](#Mirrors)
    5.  [Proxies](#Proxies)
    6.  [Profiles](#Profiles)
        1.  [Activation](#Activation)
        2.  [Repositories](#Repositories)
        3.  [Plugin Repositories](#Plugin_Repositories)

    7.  [Active Profiles](#Active_Profiles)

## Introduction

### Quick Overview

The `settings` element in the `settings.xml` file contains elements used
to define values which configure Maven execution in various ways, like
the `pom.xml`, but should not be bundled to any specific project, or
distributed to an audience. These include values such as the local
repository location, alternate remote repository servers, and
authentication information.

There are two locations where a `settings.xml` file may live:

-   The Maven install: `${maven.home}/conf/settings.xml`
-   A user's install: `${user.home}/.m2/settings.xml`

The former `settings.xml` are also called global settings, the latter
`settings.xml` are referred to as user settings. If both files exists,
their contents gets merged, with the user-specific `settings.xml` being
dominant.

Tip: If you need to create user-specific settings from scratch, it's
easiest to copy the global settings from your Maven installation to your
`${user.home}/.m2` directory. Maven's default `settings.xml` is a
template with comments and examples so you can quickly tweak it to match
your needs.

Here is an overview of the top elements under `settings`:

```
    <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/>
      <usePluginRegistry/>
      <offline/>
      <pluginGroups/>
      <servers/>
      <mirrors/>
      <proxies/>
      <profiles/>
      <activeProfiles/>
    </settings>
```

The contents of the `settings.xml` can be interpolated using the
following expressions:

1.  `${user.home}` and all other system properties *(since Maven 3.0)*
2.  `${env.HOME}` etc. for environment variables

Note that properties defined in profiles within the `settings.xml`
cannot be used for interpolation.

## Settings Details

### Simple Values

Half of the top-level `settings` elements are simple values,
representing a range of values which describe elements of the build
system that are active full-time.

    <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>
      <usePluginRegistry>false</usePluginRegistry>
      <offline>false</offline>
      ...
    </settings>

-   **localRepository**: This value is the path of this build system's
    local repository. The default value is
    `${user.home}/.m2/repository`. This element is especially useful for
    a main build server allowing all logged-in users to build from a
    common local repository.
-   **interactiveMode**: `true` if Maven should attempt to interact with
    the user for input, `false` if not. Defaults to `true`.
-   **usePluginRegistry**: `true` if Maven should use the
    `${user.home}/.m2/plugin-registry.xml` file to manage plugin
    versions, defaults to `false`. *Note that for the current version of
    Maven 2.0, the plugin-registry.xml file should not be depended upon.
    Consider it dormant for now.*
-   **offline**: `true` if this build system should operate in offline
    mode, defaults to `false`. This element is useful for build servers
    which cannot connect to a remote repository, either because of
    network setup or security reasons.

### Plugin Groups

This element contains a list of `pluginGroup` elements, each contains a
groupId. The list is searched when a plugin is used and the groupId is
not provided in the command line. This list automatically contains
`org.apache.maven.plugins` and `org.codehaus.mojo`.

    <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.mortbay.jetty</pluginGroup>
      </pluginGroups>
      ...
    </settings>

For example, given the above settings the Maven command line may execute
`org.mortbay.jetty:jetty-maven-plugin:run` with the truncated command:

    mvn jetty:run

### Servers

The repositories for download and deployment are defined by the
[`repositories`](./pom.html#Repositories) and
[`distributionManagement`](./pom.html#Distribution_Management) elements
of the POM. However, certain settings such as `username` and `password`
should not be distributed along with the `pom.xml`. This type of
information should exist on the build server in the `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>server001</id>
          <username>my_login</username>
          <password>my_password</password>
          <privateKey>${user.home}/.ssh/id_dsa</privateKey>
          <passphrase>some_passphrase</passphrase>
          <filePermissions>664</filePermissions>
          <directoryPermissions>775</directoryPermissions>
          <configuration></configuration>
        </server>
      </servers>
      ...
    </settings>

-   **id**: This is the ID of the server *(not of the user to login as)*
    that matches the `id` element of the repository/mirror that Maven
    tries to connect to.
-   **username**, **password**: These elements appear as a pair denoting
    the login and password required to authenticate to this server.
-   **privateKey**, **passphrase**: Like the previous two elements, this
    pair specifies a path to a private key (default is
    `${user.home}/.ssh/id_dsa`) and a `passphrase`, if required. The
    `passphrase` and `password` elements may be externalized in the
    future, but for now they must be set plain-text in the
    `settings.xml` file.
-   **filePermissions**, **directoryPermissions**: When a repository
    file or directory is created on deployment, these are the
    permissions to use. The legal values of each is a three digit number
    corrosponding to \*nix file permissions, ie. 664, or 775.

*Note:* If you use a private key to login to the server, make sure you
omit the `<password>` element. Otherwise, the key will be ignored.

#### Password Encryption

A new feature - server password and passphrase encryption has been added
to 2.1.0+. See details [on this
page](./guides/mini/guide-encryption.html)

### Mirrors

    <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>planetmirror.com</id>
          <name>PlanetMirror Australia</name>
          <url>http://downloads.planetmirror.com/pub/maven2</url>
          <mirrorOf>central</mirrorOf>
        </mirror>
      </mirrors>
      ...
    </settings>

-   **id**, **name**: The unique identifier and user-friendly name of
    this mirror. The `id` is used to differentiate between `mirror`
    elements and to pick the corresponding credentials from the
    [`<servers>`](#Servers) section when connecting to the mirror.
-   **url**: The base URL of this mirror. The build system will use this
    URL to connect to a repository rather than the original repository
    URL.
-   **mirrorOf**: The `id` of the repository that this is a mirror of.
    For example, to point to a mirror of the Maven `central` repository
    (`https://repo.maven.apache.org/maven2/`), set this element to
    `central`. More advanced mappings like `repo1,repo2` or `*,!inhouse`
    are also possible. This must not match the mirror `id`.

For a more in-depth introduction of mirrors, please read the [Guide to
Mirror Settings](./guides/mini/guide-mirror-settings.html).

### Proxies

    <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>myproxy</id>
          <active>true</active>
          <protocol>http</protocol>
          <host>proxy.somewhere.com</host>
          <port>8080</port>
          <username>proxyuser</username>
          <password>somepassword</password>
          <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
        </proxy>
      </proxies>
      ...
    </settings>

-   **id**: The unique identifier for this proxy. This is used to
    differentiate between `proxy` elements.
-   **active**: `true` if this proxy is active. This is useful for
    declaring a set of proxies, but only one may be active at a time.
-   **protocol**, **host**, **port**: The `protocol://host:port` of the
    proxy, seperated into discrete elements.
-   **username**, **password**: These elements appear as a pair denoting
    the login and password required to authenticate to this proxy
    server.
-   **nonProxyHosts**: This is a list of hosts which should not be
    proxied. The delimiter of the list is the expected type of the proxy
    server; the example above is pipe delimited - comma delimited is
    also common.

### Profiles

The `profile` element in the `settings.xml` is a truncated version of
the `pom.xml` `profile` element. It consists of the `activation`,
`repositories`, `pluginRepositories` and `properties` elements. The
`profile` elements only include these four elements because they
concerns themselves with the build system as a whole (which is the role
of the `settings.xml` file), not about individual project object model
settings.

If a profile is active from `settings`, its values will override any
equivalently ID'd profiles in a POM or `profiles.xml` file.

#### Activation

Activations are the key of a profile. Like the POM's profiles, the power
of a profile comes from its ability to modify some values only under
certain circumstances; those circumstances are specified via an
`activation` element.

    <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>test</id>
          <activation>
            <activeByDefault>false</activeByDefault>
            <jdk>1.5</jdk>
            <os>
              <name>Windows XP</name>
              <family>Windows</family>
              <arch>x86</arch>
              <version>5.1.2600</version>
            </os>
            <property>
              <name>mavenVersion</name>
              <value>2.0.3</value>
            </property>
            <file>
              <exists>${basedir}/file2.properties</exists>
              <missing>${basedir}/file1.properties</missing>
            </file>
          </activation>
          ...
        </profile>
      </profiles>
      ...
    </settings>

Activation occurs when all specified criteria have been met, though not
all are required at once.

-   **jdk**: `activation` has a built in, Java-centric check in the
    `jdk` element. This will activate if the test is run under a jdk
    version number that matches the prefix given. In the above example,
    `1.5.0_06` will match. Ranges are also supported as of Maven 2.1.
    See the
    [maven-enforcer-plugin](https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html)
    for more details about supported ranges.
-   **os**: The `os` element can define some operating system specific
    properties shown above. See the
    [maven-enforcer-plugin](https://maven.apache.org/plugins/maven-enforcer-plugin/rules/requireOS.html)
    for more details about OS values.
-   **property**: The `profile` will activate if Maven detects a
    property (a value which can be dereferenced within the POM by
    `${name}`) of the corresponding `name=value` pair.
-   **file**: Finally, a given filename may activate the `profile` by
    the `existence` of a file, or if it is `missing`.

The `activation` element is not the only way that a `profile` may be
activated. The `settings.xml` file's `activeProfile` element may contain
the profile's `id`. They may also be activated explicitly through the
command line via a comma separated list after the `-P` flag (e.g.
`-P test`).

*To see which profile will activate in a certain build, use the*
`maven-help-plugin`.

    mvn help:active-profiles

#### Properties

Maven properties are value placeholder, like properties in Ant. Their
values are accessible anywhere within a POM by using the notation
`${X}`, where `X` is the property. They come in five different styles,
all accessible from the `settings.xml` file:

1.  `env.X`: Prefixing a variable with "env." will return the shell's
    environment variable. For example, `${env.PATH}` contains the \$path
    environment variable (`%PATH%` in Windows).
2.  `project.x`: A dot (.) notated path in the POM will contain the
    corresponding element's value. For example:
    `<project><version>1.0</version></project>` is accessible via
    `${project.version}`.
3.  `settings.x`: A dot (.) notated path in the `settings.xml` will
    contain the corresponding element's value. For example:
    `<settings><offline>false</offline></settings>` is accessible via
    `${settings.offline}`.
4.  Java System Properties: All properties accessible via
    `java.lang.System.getProperties()` are available as POM properties,
    such as `${java.home}`.
5.  `x`: Set within a \<properties /\> element or an external files, the
    value may be used as `${someVar}`.

<!-- -->

    <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>
          ...
          <properties>
            <user.install>${user.home}/our-project</user.install>
          </properties>
          ...
        </profile>
      </profiles>
      ...
    </settings>

The property `${user.install}` is accessible from a POM if this profile
is active.

#### Repositories

Repositories are remote collections of projects from which Maven uses to
populate the local repository of the build system. It is from this local
repository that Maven calls it plugins and dependencies. Different
remote repositories may contain different projects, and under the active
profile they may be searched for a matching release or snapshot
artifact.

    <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>
          ...
          <repositories>
            <repository>
              <id>codehausSnapshots</id>
              <name>Codehaus Snapshots</name>
              <releases>
                <enabled>false</enabled>
                <updatePolicy>always</updatePolicy>
                <checksumPolicy>warn</checksumPolicy>
              </releases>
              <snapshots>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
                <checksumPolicy>fail</checksumPolicy>
              </snapshots>
              <url>http://snapshots.maven.codehaus.org/maven2</url>
              <layout>default</layout>
            </repository>
          </repositories>
          <pluginRepositories>
            ...
          </pluginRepositories>
          ...
        </profile>
      </profiles>
      ...
    </settings>

-   **releases**, **snapshots**: These are the policies for each type of
    artifact, Release or snapshot. With these two sets, a POM has the
    power to alter the policies for each type independent of the other
    within a single repository. For example, one may decide to enable
    only snapshot downloads, possibly for development purposes.
-   **enabled**: `true` or `false` for whether this repository is
    enabled for the respective type (`releases` or `snapshots`).
-   **updatePolicy**: This element specifies how often updates should
    attempt to occur. Maven will compare the local POM's timestamp
    (stored in a repository's maven-metadata file) to the remote. The
    choices are: `always`, `daily` (default), `interval:X` (where X is
    an integer in minutes) or `never`.
-   **checksumPolicy**: When Maven deploys files to the repository, it
    also deploys corresponding checksum files. Your options are to
    `ignore`, `fail`, or `warn` on missing or incorrect checksums.
-   **layout**: In the above description of repositories, it was
    mentioned that they all follow a common layout. This is mostly
    correct. Maven 2 has a default layout for its repositories; however,
    Maven 1.x had a different layout. Use this element to specify which
    if it is `default` or `legacy`.

#### Plugin Repositories

Repositories are home to two major types of artifacts. The first are
artifacts that are used as dependencies of other artifacts. These are
the majority of plugins that reside within central. The other type of
artifact is plugins. Maven plugins are themselves a special type of
artifact. Because of this, plugin repositories may be separated from
other repositories (although, I have yet to hear a convincing argument
for doing so). In any case, the structure of the `pluginRepositories`
element block is similar to the `repositories` element. The
`pluginRepository` elements each specify a remote location of where
Maven can find new plugins.

### Active Profiles

    <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>env-test</activeProfile>
      </activeProfiles>
    </settings>

The final piece of the `settings.xml` puzzle is the `activeProfiles`
element. This contains a set of `activeProfile` elements, which each
have a value of a `profile` `id`. Any `profile` `id` defined as an
`activeProfile` will be active, reguardless of any environment settings.
If no matching profile is found nothing will happen. For example, if
`env-test` is an `activeProfile`, a profile in a `pom.xml` (or
`profile.xml` with a corrosponding `id` will be active. If no such
profile is found then execution will continue as normal.

