 ------
 Introduction to Repositories
 ------
 Jason van Zyl
 Brian Fox
 ------
 2008-05-13
 ------

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

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html

Introduction to Repositories

* Artifact Repositories

 A repository in Maven holds build artifacts and dependencies of varying types.

 There are exactly two types of repositories: local and remote. The local repository is a directory
 on the computer where Maven runs. It caches remote downloads and contains temporary
 build artifacts that you have not yet released.

 Remote repositories refer to any other type of repository, accessed by a variety of protocols such as
 <<<file://>>> and <<<https://>>>. These repositories might be a truly remote repository
 set up by a third party to provide their artifacts for downloading (for example,
 {{{https://repo.maven.apache.org/maven2/}repo.maven.apache.org}}).
 Other "remote" repositories may be internal repositories
 set up on a file or HTTP server within your company, used to share private artifacts between development teams
 and for releases.

 Local and remote repositories are structured the same way so that scripts can run on either
 side, or they can be synced for offline use. The layout of the repositories is completely
 transparent to the Maven user, however.

* Using Repositories

  In general, you should not need to do anything with the local repository on a regular basis, except clean
  it out if you are short on disk space (or erase it completely if you are willing to download everything again).

  For the remote repositories, they are used for both downloading and uploading (if you have the permission to
  do so).

** Downloading from a Remote Repository

 Downloading in Maven is triggered by a project declaring a dependency that is not present in the local
 repository (or for a <<<SNAPSHOT>>>, when the remote repository contains one that is newer).
 By default, Maven will download from the {{{https://repo.maven.apache.org/maven2/}central}} repository.

 To override this, you need to specify a <<<mirror>>> as shown in {{{../mini/guide-mirror-settings.html}Using Mirrors for Repositories}}

 You can set this in your <<<settings.xml>>> file to globally use a certain mirror. However,
 it is common for a project to customise the repository in its <<<pom.xml>>>
 and that your setting will take precedence. If dependencies are not being found, check that you
 have not overridden the remote repository.

 For more information on dependencies, see {{{./introduction-to-dependency-mechanism.html}Dependency Mechanism}}.

** Using Mirrors for the Central Repository

 There are several official Central repositories geographically distributed. You can make
 changes to your <<<settings.xml>>> file to use one or more mirrors. Instructions for this can be
 found in the guide {{{../mini/guide-mirror-settings.html}Using Mirrors for Repositories}}.

* Building Offline

 If you are temporarily disconnected from the internet and you need to build your projects offline,
 you can use the offline switch on the CLI:

+---+

 mvn -o package

+---+

 Many plugins honor the offline setting and do not perform any operations that connect to
 the internet. Some examples are resolving Javadoc links and link checking the site.

* Uploading to a Remote Repository

 While this is possible for any type of remote repository, you must have the permission to do so.
 To have someone upload to the central Maven repository, see {{{../../repository/index.html}Repository Center}}.

* Internal Repositories

 When using Maven, particularly in a corporate environment, connecting to the internet to download dependencies
 is not acceptable for security, speed or bandwidth reasons. For that reason, it is desirable to set up an
 internal repository to house a copy of artifacts, and to publish private artifacts to.

 Such an internal repository can be downloaded using HTTP or the file system (with a <<<file://>>>
 URL), and uploaded to using SCP, FTP, or a file copy.

 As far as Maven is concerned, there is nothing special about this repository: it is another
 <<remote repository>> that contains artifacts to download to a user's local cache, and is a publish
 destination for artifact releases.

 Additionally, you may want to share the repository server with your generated project sites. For more
 information on creating and deploying sites, see {{{../mini/guide-site.html}Creating a Site}}.

* Setting up the Internal Repository

 To set up an internal repository just requires that you have a place to put it, and then copy
 required artifacts there using the same layout as in a remote repository such as {{{https://repo.maven.apache.org/maven2/}repo.maven.apache.org}}.

 It is <not> recommended that you scrape or <<<rsync://>>> a full copy of central as there is a large amount
 of data there and doing so will get you banned. You can use a program such as those described on the {{{../../repository-management.html}Repository Management}} page to
 run your internal repository's server, download from the internet as required, and then hold
 the artifacts in your internal repository for faster downloading later.

 The other options available are to manually download and vet releases, then copy them to the internal
 repository, or to have Maven download them for a user, and manually upload the vetted artifacts to the
 internal repository which is used for releases. This step is the only one available for artifacts where
 the license forbids their distribution automatically, such as several J2EE JARs provided by Sun.
 Refer to the {{{../mini/guide-coping-with-sun-jars.html}Guide to coping with SUN JARs}} document for more information.

 It should be noted that Maven intends to include enhanced support for such features in the future,
 including click through licenses on downloading, and verification of signatures.

* Using the Internal Repository

 Using the internal repository is quite simple. Simply make a change to add a <<<repositories>>> element:

+----+

<project>
  ...
  <repositories>
    <repository>
      <id>my-internal-site</id>
      <url>http://myserver/repo</url>
    </repository>
  </repositories>
  ...
</project>

+----+

 If your internal repository requires authentication, the <<<id>>> element can be used in your {{{../../settings.html#Servers}settings}} file
 to specify login information.

* Deploying to the Internal Repository

 One of the most important reasons to have one or more internal repositories is to be able to publish
 your own private releases.

 To publish to the repository, you will need to have access via one of SCP, SFTP, FTP, WebDAV, or the filesystem. Connectivity is accomplished with the various
 {{{/wagon/wagon-providers/index.html}wagons}}. Some wagons may need to be added as {{{/ref/current/maven-model/maven.html#class_extension}extension}} to your build.
~~ For example, to set up an SCP transfer.
~~ show the scp example.
