Chapter 06Lesson 04150–195 min

Maven 2 Repositories, Snapshots, Releases, Metadata, Checksums, and Maven Client Configuration: Diagnostics, Failure Modes, Security, and Performance

Diagnose Maven/Nexus failures from evidence: server-id mismatches, policy rejections, stale local cache, checksum/metadata symptoms, public fallback, mutable releases, proxy state, authorization, and storage health.

401 / 403Version policyStale cacheChecksum evidenceDiagnostics

Learning objectives

  • Use an evidence-first diagnostic sequence for Maven/Nexus incidents.
  • Distinguish server-ID/authentication failures from repository policy and authorization failures.
  • Recognize release/snapshot version-policy rejection and immutable-release redeploy rejection without weakening the policy.
  • Detect when Maven's local cache hides Nexus behavior and when a proxy/upstream issue is the actual cause.
  • Repair the smallest controlled state and verify with a fresh request.

Incident rule. Do not delete Nexus blob files, database rows, or broad caches to make an error disappear. Preserve the original HTTP/Maven output, isolate the client first, then mutate only disposable lab state.

1. Diagnostic sequence: keep layers in order

Repository incidents become expensive when operators jump directly from “Maven failed” to “clear everything.” Use the course sequence instead:

Evidence-first Maven/Nexus diagnosis
flowchart TD
E[Preserve Maven/HTTP evidence] --> V[Confirm Nexus + Maven versions]
V --> C[Inspect client URL, mirror, server IDs, local repo]
C --> T[Inspect repository type, version policy, group order]
T --> A[Inspect authorization]
A --> M[Inspect component/assets/Maven metadata]
M --> P[Inspect proxy cache/upstream]
P --> S[Inspect database/blob/disk/logs/tasks]
S --> X[Apply least destructive correction]
X --> R[Verify from fresh local Maven repo]

2. Broken example: server ID mismatch produces authentication failure

Maven does not attach a server credential because the username “looks right.” It looks up credentials by repository ID. If the command uses -DrepositoryId=wrong-id but settings.xml contains only academy-ch06-releases, the request reaches the repository without the intended credentials and commonly fails with 401.

set +e
mvn -s "$LAB/settings.xml" org.apache.maven.plugins:maven-deploy-plugin:3.1.4:deploy-file   -DrepositoryId=wrong-id   -Durl="$NX_URL/repository/academy-ch06-releases/"   -Dfile="$LAB/project/ch06-demo.jar"   -DpomFile="$LAB/project/release-pom.xml"   2>&1 | tee "$LAB/evidence/10-intentional-auth-failure.txt"
RC=${PIPESTATUS[0]}
set -e
printf 'Expected non-zero exit: %s
' "$RC"

Repair: restore the correct repository ID. Do not widen the Nexus role or switch to administrator credentials until the client-side ID mapping is proven correct.

3. Version policy rejection is not an authentication problem

A release-version POM sent to a Snapshot-policy repository—or a -SNAPSHOT POM sent to a Release-policy repository—violates the repository's Maven version policy. The right repair is to send the component to the correct hosted lane or correct the intended project version. Do not change the repository to Mixed merely to silence a one-off deployment mistake.

4. Mutable release attempt: preserve the rejection

After 1.0.0 exists in a hosted repository whose deployment policy is Disable redeploy, publishing different bytes to the same path should be rejected. That rejection protects downstream reproducibility.

printf 'chapter=06
artifact=ch06-demo
content=MUTATED
' > "$LAB/project/payload/info.txt"
(cd "$LAB/project/payload" && jar --create --file ../ch06-demo-mutated.jar info.txt)
sha256sum "$LAB/project/ch06-demo-mutated.jar" | tee "$LAB/evidence/11-mutated-sha256.txt"

set +e
mvn -s "$LAB/settings.xml" org.apache.maven.plugins:maven-deploy-plugin:3.1.4:deploy-file   -DrepositoryId=academy-ch06-releases   -Durl="$NX_URL/repository/academy-ch06-releases/"   -Dfile="$LAB/project/ch06-demo-mutated.jar"   -DpomFile="$LAB/project/release-pom.xml"   2>&1 | tee "$LAB/evidence/12-redeploy-rejection.txt"
RC=${PIPESTATUS[0]}
set -e
printf 'Expected non-zero redeploy exit: %s
' "$RC"

Repair: publish a new version such as 1.0.1 after the build is intentionally versioned and accepted. Do not flip the release repository to Allow redeploy as an incident shortcut.

5. Stale Maven local cache can make a Nexus fix appear ineffective

If a build already has an artifact locally, Maven may not ask Nexus. Conversely, Maven can cache failed resolution state and wait for an update interval. The safest diagnostic is a fresh disposable local repository, not deleting a developer's whole ~/.m2 tree.

FRESH="$LAB/m2-fresh-$(date +%s)"
mkdir -p "$FRESH"
MAVEN_LAB_REPO="$FRESH" mvn -s "$LAB/settings.xml" -U   org.apache.maven.plugins:maven-dependency-plugin:3.9.0:get   -Dartifact=com.example.academy:ch06-demo:1.0.0   | tee "$LAB/evidence/13-fresh-resolution.txt"

If the fresh client succeeds while the old client fails, investigate local-cache metadata rather than changing Nexus. If both fail, continue down the repository/authorization/cache/upstream/storage sequence.

6. Metadata/checksum symptoms: do not bypass integrity controls

A checksum mismatch can result from corrupted local bytes, an unexpected upstream mutation, proxy/network interference, or wrong expected metadata. Preserve the expected and actual digest, URL, coordinate, repository member, and response headers. Re-fetch into a fresh local repository. If the mismatch persists, investigate Nexus/upstream state; do not configure Maven to ignore checksums merely to turn the build green.

A missing or stale snapshot can be metadata-related rather than a missing JAR. Inspect maven-metadata.xml and the timestamped assets before deleting anything.

7. Internal coordinate unexpectedly resolved from public upstream

This is an architecture incident, not merely a dependency success. Capture the effective Maven mirror, Nexus group member order, routing rules, and network path. If clients can bypass Nexus or the internal namespace is allowed through the public proxy, a public coordinate may satisfy an internal request. The durable fix is namespace/egress governance, not repeatedly pinning whichever version happened to resolve today.

8. Performance: ask which layer is slow

Symptom Likely evidence to gather
Fast second build, slow first build Maven local cache and Nexus proxy cold/warm state; upstream latency.
All clients slow for internal hosted artifact Nexus JVM/DB/blob IO/network; repository request logs/metrics.
Only one workstation slow Local Maven cache, DNS/proxy/JDK/TLS path, local disk.
Public dependency slow only when uncached Proxy remote health, upstream latency, Nexus proxy cache age/auto-blocking.
Metadata requests dominate Snapshot/update policies, Maven metadata age, proxy metadata cache behavior.

9. Repair verification

A repair is complete only when a controlled fresh request succeeds and the evidence still explains the original failure. Keep the rejected log, corrected configuration diff, final coordinate, repository that served it, and SHA-256 of accepted/retrieved bytes. That turns troubleshooting into an auditable incident narrative.

Knowledge check

A deploy gets 401 and the Nexus user exists. What should you inspect before changing roles?

A release deploy is rejected because 1.0.0 already exists. What is the safe production response?

Why can a fresh -Dmaven.repo.local path be more informative than clearing Nexus caches?

If a checksum mismatch disappears only after checksum validation is disabled, is the incident repaired?

A private coordinate resolves from Central. Which controls should be inspected?

10. Summary

Diagnose Maven failures from the outside in: client settings/cache, repository topology/policy, authorization, component/asset/metadata state, proxy/upstream behavior, then database/blob/disk/log evidence. The checkpoint combines those layers into one fresh-client publication and verification run.

Next lesson

Checkpoint: prove release identity

Publish, inspect, consume from a fresh cache, verify hashes, and remove only disposable state.

Official references and version notes

Version-sensitive statements were rechecked against Sonatype and Apache Maven primary documentation on 2026-08-26. The mandatory lab pins Nexus Repository Community Edition 3.95.2 and Apache Maven 3.9.16. Nexus 3.95.2 was released 2026-08-21; Maven 3.9.16 is the current recommended Maven 3 release. Nexus 3.87+ requires Java 21 when using an external JVM and official Nexus packages include a bundled Java 21 runtime. Re-check live support/download pages before executing these labs.

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0 Send only Ethereum/ERC-20 compatible assets to this address.