How can you declare a local file-system Maven repository as a publish target, and when is that useful?
answer
- url = uri(layout.buildDirectory.dir("repo"))
- file: URI publish target
- full Maven layout written to disk
- verify POM/coordinates offline
- not the same as mavenLocal
basics
~10 sPoint the repository url at a local directory via uri(layout.buildDirectory.dir("repo")). Gradle writes the full Maven layout there. Useful for testing publication output without hitting a real server.
solid answer
~30 sA publish repository's `url` accepts a `file:` URI, so you can target a local directory instead of an HTTP endpoint: ```kotlin publishing { repositories { maven { name = "localStaging" url = uri(layout.buildDirectory.dir("staging-repo")) } } } ``` Running `publishAllPublicationsToLocalStagingRepository` materialises the complete `group/artifact/version/` Maven layout — jar, POM, checksums, `maven-metadata.xml` — under `build/staging-repo`. This is invaluable for **verifying** what your publication actually produces (correct coordinates, POM dependencies, classifiers) without credentials or network, and for integration tests that resolve the artifact back. Using `layout.buildDirectory` keeps the output inside `build/` so `clean` removes it and the path is build-relative rather than hardcoded.
code
kotlin · 9 linespublishing {
repositories {
maven {
name = "localStaging"
url = uri(layout.buildDirectory.dir("staging-repo"))
}
}
}
// ./gradlew publishAllPublicationsToLocalStagingRepositorygo deeper
Know url can point at a local folder for testing publish output.
Use layout.buildDirectory.dir and explain what files land on disk and why it's useful.
Design a hermetic publish-then-resolve integration test against a temp file repo; distinguish it from mavenLocal.
Adopt file-repo verification as a publishing-quality gate in CI before promotion to the real release repository.
## File URLs as publish targets The `url` of a `maven { }` publish repository is just a `URI`; nothing requires it to be `https`. A `file:` URI points at a directory on disk, and Gradle's `MavenArtifactRepository` will lay out the standard Maven directory structure there exactly as it would on a remote server. ## Building the path correctly Prefer `layout.buildDirectory` over a raw string: ```kotlin url = uri(layout.buildDirectory.dir("staging-repo")) ``` `layout.buildDirectory` is a `DirectoryProperty` (a lazy `Provider`), so the path resolves relative to the project's build directory and is wiped by `clean`. Hardcoding `file:///abs/path` is brittle and not portable across machines/CI. ## What gets written After `./gradlew publishAllPublicationsToLocalStagingRepository`, the directory contains the full layout: ``` staging-repo/com/example/lib/1.0/lib-1.0.jar staging-repo/com/example/lib/1.0/lib-1.0.pom staging-repo/com/example/lib/1.0/lib-1.0.module (Gradle Module Metadata) ... plus .sha1/.md5 checksums and maven-metadata.xml ``` ## When it's useful - **Inspecting output**: confirm the generated POM, dependency scopes, classifiers, and coordinates before pushing to a real repo. - **Hermetic tests**: a `TestKit`/integration test publishes to a temp file repo, then a second build resolves from it — no network, fully reproducible. - **Air-gapped staging**: produce an on-disk repository to be shipped/synced elsewhere. ## Relationship to mavenLocal This is *not* the same as `publishToMavenLocal`, which always targets the user's `~/.m2/repository` (a sibling topic). A declared file repository is an arbitrary directory you control and name, complete with its own generated `publishTo<Name>Repository` tasks.
- Why use `layout.buildDirectory.dir(...)` instead of a hardcoded absolute path?It is a lazy build-relative DirectoryProperty: portable across machines/CI and cleaned up by `clean`, whereas an absolute string is brittle and machine-specific.
- How is a declared file repository different from publishToMavenLocal?publishToMavenLocal always writes to the user's ~/.m2 install; a declared file repository writes to any directory you name and gets its own generated publishTo<Name>Repository tasks.
saying these in an interview costs you the question
- Treating a file publish repository as identical to mavenLocal/~/.m2.
- Hardcoding an absolute file path instead of a build-relative DirectoryProperty.