~~ 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.

           ---------
           Snapshots
           ---------

  Snapshot builds are created from the current source in the SVN repository. They are assembled
  automatically by {{{http://jenkins-ci.org/}Jenkins}} and become available a few hours after
  the last change. They can be downloaded from
  {{{https://builds.apache.org/job/axis-trunk/lastSuccessfulBuild/org.apache.axis$distribution/}here}}.
  In addition, the corresponding Maven artifacts are deployed automatically to the Apache snapshot repository.
  To use them as dependencies in your Maven project, add the following repository configuration to your POM file:

---------------------------------------------------------
<repositories>
    <repository>
        <id>apache.snapshots</id>
        <name>Apache Snapshot Repository</name>
        <url>http://repository.apache.org/snapshots</url>
        <releases>
            <enabled>false</enabled>
        </releases>
    </repository>
</repositories>
---------------------------------------------------------

  If you also want to use snapshot versions of the Maven plugins for Axis, then you need to add that
  repository as a <<<pluginRepository>>> as well.