blob: 979c32eb162439fd42864fe004bff02e039740dd [file] [log] [blame] [view]
## 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.