
Migrating from Nexus
Arca reads a Sonatype Nexus 3 instance and reproduces its repositories here. It only ever sends GET
requests to Nexus: there is no code path that can create, change or delete anything there, so it is
safe to point at production.
The migration lives on the Maintenance page under Manage, and needs an administrator account.
What you need
A Nexus account with read access to repository definitions and content. It needs no write permission of any kind, so the safest thing to hand it is a read-only role.
You do not need an API token. The migration writes straight into this instance rather than calling back into its own API.
Look before you leap
Fill in the Nexus URL, the account to read it with, and press Preview. Nothing is written on either side. Arca lists every repository it found and what it intends to do with each one:
| Repository | Becomes | Notes |
|---|---|---|
maven-central |
maven2 proxy | Recreated pointing at the same upstream, cache not copied |
maven-releases |
maven2 hosted | Assets are copied across |
p2-releases |
p2 hosted | Assets are copied across |
maven-public |
skipped | groups are not migrated; recreate it as a p2 group, or point clients at the members directly (maven-central, maven-releases) |
docker-hosted |
skipped | arca has no docker format |
The password is used for that run and never stored.
Running it
Start migration becomes available once you have previewed. The run continues in the background, so you can leave the page: the progress table shows each repository moving from waiting to done, with a running count of files copied, files already present, and failures. Cancel stops it.
Only one migration runs at a time.
How each repository is treated
| Nexus | Becomes |
|---|---|
maven2 hosted |
a hosted maven2 repository, every asset copied |
maven2 proxy |
a proxy pointing at the same upstream, cache not copied |
npm hosted or proxy |
the same, as npm |
raw |
a p2 repository, every asset copied |
| group | skipped |
| any other format | skipped |
A proxy holds nothing that cannot be fetched again, so copying its cache would be a slow way to move files you already have upstream. The recreated proxy refills itself on first use.
Nexus raw repositories become p2 because that is what they usually hold: Nexus 3 dropped the p2
format, so a p2 site published to Nexus lives in a raw repository. A p2 repository here stores
whatever paths you publish to it, so it serves those sites unchanged. Change Raw repositories
become if one of yours holds something else.
A Maven repository’s version policy carries across, so a SNAPSHOT repository in Nexus arrives as a
snapshot repository here.
Names are lowercased, because arca repository names are. A Nexus name that is still not valid after that is skipped and left for you to create by hand.
Groups
Group repositories are not migrated. Which members a group should carry is a decision worth making deliberately rather than inheriting, and arca only has groups for p2. The preview names the members of every group it skipped, so you can either point clients at those directly or, for p2, rebuild it as a group repository afterwards.
Interruptions
Start it again. Repositories that already exist are reported as such, and assets already present are skipped after one lookup, so a rerun transfers only what is missing. That makes it safe to cancel a long migration, or to run it once to move the bulk and again later to catch up.
It also means the migration will not reconfigure a repository you have already set up by hand. It fills that repository with the Nexus content but leaves its settings alone. If you want the Nexus settings instead, delete yours first and run it again.
If it reports no repositories
Nexus answers the repository list with an empty array rather than an error when the account cannot read repository definitions, so an unauthenticated run looks like an empty instance. Arca says so explicitly. Check the username and its privileges.
Once it is done
Point your builds at the new URLs. A repository keeps its name, so
https://nexus.example.com/repository/p2-releases/... becomes
https://repo.example.com/repository/p2-releases/... with the path after it unchanged.