 ----
 Setting up an Artifact Repository
 ----
~~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.

Setting up an Artifact Repository

  Setting up an artifact repository is highly recommended for working with NPanday and Maven projects in general.

  In this example, we configure {{{http://archiva.apache.org/} Apache Archiva}}, however other repository managers
  will operate similarly. Instructions on installing Archiva can be found on the
  {{{http://archiva.apache.org/docs/current/quick-start.html} Archiva web site}}.

* Proxying Future Releases

  NPanday releases are mirrored to the central repository configured by
  default in Maven and all known repository managers. There should be nothing
  more to do once you've installed a repository manager to get access to new
  NPanday releases.

* Creating an NPanday repository

  If you're prefer to download the repository from the release and unpack it
  into your repository manager, rather than proxy them from an external
  location on deman, you can do so.

  ~~TODO: pictures would help

  Logged in as the administrator created when installed, go to the <Repositories> tab and add a new managed repository.
  Use the following values:

    * <Identifier>: <<<npanday>>>

    * <Name>: NPanday Repository

    * <Location>: the path where the NPanday release repository was unpacked on your machine

    []

  After adding this, you may be prompted due to the content already existing - you can safely request to continue.

  Next, you will need to go to the <Users> tab and select the <<<guest>>> user, and follow the screens to allocate them
  with <Repository Observer> permission for the <<<npanday>>> repository to allow it to be accessed without a username
  and password.

  This will make all of the NPanday artifacts available at {{http://localhost:8080/archiva/repository/npanday/}}.

* Configuring Maven to use the NPanday repository

  You will next need to configure Maven to use this remote repository. This can be done using the instructions shown on
  the Archiva web site, {{{http://archiva.apache.org/docs/1.3/userguide/using-repository.html} Configuring Maven 2 to use an Archiva repository}}.

* Separate NPanday Release Repository

  The above techniques provide repositories that contain not only the NPanday releases, but also all of the artifacts
  it depends on.

  Alternatively, you can configure NPanday releases into a single managed repository, and other dependencies in
  separate repositories.

  For the NPanday releases, they can be obtained as above either from the <<<npanday>>> subdirectory of the downloaded
  repository, or from a Maven repository.

  For the dependencies, NUnit is needed:

    * 3rd party .NET dependencies. Some can be obtained from {{https://archiva-repository.apache.org/archiva/repository/3rdparty/}},
      or they can be uploaded manually to your own managed repository. Currently, only NUnit is included there.

    []
    
