blob: 9da4e0d37477a1ef0e914edb73e7a3033800884b [file] [log] [blame]
------
Guide to relocation
------
Dennis Lundberg
------
2006-07-08
------
~~ 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
Guide to relocation
Sometimes it is necessary to relocate artifacts in the repository. One
example of that is when a project moves from Maven 1 to Maven 2. Maven 1
projects have traditionally used a flat repository structure, while Maven 2
uses a deep repository structure. As an example the Maven 1 project has a groupId
of <<<maven>>> while the Maven 2 project has a groupId of <<<org.apache.maven>>>.
Making changes to the repository can have far reaching consequences. So it is
best to get it right the first time, hence this guide. It will go through a
couple of different kinds of relocations:
* Maven 1 to Maven 1
* Maven 2 to Maven 2
* Maven 1 to Maven 2
[]
The goal of the examples below is to relocate the groupId from <<<bar>>> to
<<<org.bar>>> for the <<<foo>>> project.
* How to relocate a Maven 1 artifact to a different groupId
[[1]] Copy all <<<foo>>>-related files from <<</bar/>>> in your Maven 1 repository
to a temporary location.
[[2]] Change the groupId to <<<org.bar>>> in all the <<<foo>>>-related pom files in
the temporary location.
[[3]] If your project uses MD5 or SHA1 checksums you must now create new checksums for
the changed pom files in the temporary location. If the pom file needs to be
signed, do that as well.
[[4]] Copy all files from the temporary location to <<</org.bar/>>> in your
Maven 1 repository.
[[5]] If your project syncs with ibiblio, you should now initiate that sync.
This might happen automatically depending on your projects sync policy.
[]
Your <<<foo>>>-artifacts are now available to Maven 1 users with both the old and
the new groupId.
** Releasing the next version
When the next release of <<<foo>>> is made, you publish the Maven 1 pom as you
have always done. Unfortunately Maven 1 does not have a concept of automatic
relocation and notification, so you will have to inform your users of the
changed groupId through your regular information channels.
* How to relocate a Maven 2 artifact to a different groupId
[[1]] Copy all <<<foo>>>-related files from <<</bar/foo/>>> in your Maven 2
repository to a temporary location.
[[2]] Change the groupId to <<<org.bar>>> in all <<<foo>>>-related pom files in the
temporary location.
[[3]] Copy all files from the temporary location to <<</org/bar/foo/>>> in
your Maven 2 repository.
[[4]] Create a minimal Maven 2 pom file for every old release of <<<foo>>> in
your Maven 2 repository. The pom files only need to include <<<groupId>>>,
<<<artifactId>>>, <<<version>>> and the relocation section.
<<Note:>> Before you replace your old pom files in <<</bar/foo/>>> with these
minimal pom files, make sure you have made backups!
The minimal pom file might look like this for version 1.0 of <<<foo>>>:
+----+
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>bar</groupId>
<artifactId>foo</artifactId>
<version>1.0</version>
<distributionManagement>
<relocation>
<groupId>org.bar</groupId>
</relocation>
</distributionManagement>
</project>
+----+
In this case we are relocating because the groupId has changed. We only need
to add the element that has changed to the <<<relocation>>> element. For
information on which elements are allowed in the <<<relocation>>> element,
see
{{{/ref/current/maven-model/maven.html#class_relocation}the pom reference}}.
[[5]] If your project uses MD5 or SHA1 checksums you must now create new checksums for
the pom files in <<</bar/foo/>>> in your Maven 2 repository. If the pom file needs
to be signed, do that as well.
[[6]] If your project syncs with ibiblio, you should now initiate that sync.
This might happen automatically depending on your projects sync policy.
[]
Your <<<foo>>>-artifacts are now available to Maven 2 users with both the old
and the new groupId. Projects using the old groupId will automatically be
redirected to the new groupId and a warning telling the user to update their
dependencies will be issued.
** Releasing the next version
When the next release of <<<foo>>> is made, you should publish two Maven 2 pom
files. First you should publish a pom with the new groupId <<<org.bar>>>.
Because data in the repository is not supposed to change, Maven 2 doesn't
download pom files that it has already downloaded. Therefore you will also need
to publish a pom file with the old groupId <<<bar>>> for the new version. This
should be a minimal relocation pom (as described in step 4 above), but for the
new version of <<<foo>>>.
For the release after that, you only need to publish a Maven 2 pom with a
groupId of <<<org.bar>>>, since users of the previous version have been
informed of the changed groupId.
* How to relocate a Maven 1 artifact to a Maven 2 artifact with a different groupId
<This is only of interest to organizations (like the Apache Software
Foundation) that automatically converts the contents of their Maven 1
repository to their Maven 2 repository.>
Follow steps 4 to 6 in the section <How to relocate a Maven 2 artifact to a
different groupId> above.
** Releasing the next version
When the next release of <<<foo>>> is made, you should publish the Maven 1 pom
as you have always done. In addition to that, you should publish a Maven 2 pom
with a groupId of <<<bar>>>, a version of \<next-version\> and include a
relocation section. This step can be done once for the first release of a
project, after the groupId has been changed, but your users will be happier if
you do it more times.