~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements.  See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership.  The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License.  You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied.  See the License for the
~~ specific language governing permissions and limitations
~~ under the License.

 -----
 Introduction
 -----
 Vincent Siveton
 -----
 2006-11-04
 -----

Maven 4 API - Immutable Settings Model

 This is strictly the immutable model for Maven settings in <<<org.apache.maven.api.settings>>> package.

 The following are generated from this model:

   * {{{./apidocs/index.html}Java sources}} with <<<Builder>>> inner classes for immutable instances creation.

 See also corresponding {{{../../maven-settings/index.html}Maven classical settings model documentation}}.
 