blob: 26113d8513f0883591660e287ff0d5793cb862f5 [file] [log] [blame]
------
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>>:
[[1]] 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.
[[2]] <<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 {{{/repository/}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.