skip to content

pluginManagement {} in settings

Declaring plugin repositories in settings.gradle.kts, why that block is evaluated before any plugin is applied, and includeBuild for plugin sources. Asked because plugin repositories cannot live where dependency repositories live.

on this pageshow

questions

5

What is the pluginManagement {} block, and where must it appear in a Gradle build?

level: juniorimportance: must knowfreq 62%

answer

  1. settings.gradle.kts, not build.gradle
  2. must be first block
  3. configures plugin repositories
  4. evaluated before any plugins {}
  5. fails fast if misplaced

basics

~10 s

pluginManagement {} is a block in settings.gradle.kts that configures where Gradle resolves plugins from (repositories) and how. It must be the first block in the settings file, before anything else.

solid answer

~40 s

`pluginManagement {}` lives in `settings.gradle(.kts)` and controls plugin resolution for the whole build: which repositories plugins are fetched from, and resolution/version rules. The critical constraint is placement — it must be the **very first** block evaluated in the settings file, before `plugins {}`, `dependencyResolutionManagement {}`, `include(...)`, etc. Inside it the most common content is a `repositories {}` block, e.g. `gradlePluginPortal()` and `mavenCentral()`. Because settings is evaluated before any project's `build.gradle`, configuring repositories here makes them available to every `plugins {}` block in the build. If you put it after other statements Gradle fails with an error telling you it must come first.

code

kotlin · 10 lines
kotlin
// settings.gradle.kts — pluginManagement must come first
pluginManagement {
    repositories {
        gradlePluginPortal()
        mavenCentral()
    }
}

rootProject.name = "my-app"
include(":core", ":app")

go deeper

for a junior

Know it lives in settings.gradle.kts, configures where plugins are resolved from, and must be the first block.

for a middle

Explain the ordering rule and the reason (settings evaluated before any plugins {}), and the distinction from dependency repositories.

for a senior

Discuss how this centralizes plugin sourcing across a multi-project build and interacts with settings plugins and included builds.

for a principal

Frame it as the org-wide control point for plugin provenance — pointing every team's builds at vetted internal repositories instead of the public portal.

## What problem does it solve When a build script declares `plugins { id("...") version "..." }`, Gradle must *find* that plugin somewhere. By default it looks at the **Gradle Plugin Portal**. To add or change those locations — for example to pull plugins from a corporate Maven repository or Maven Central — you configure the **`pluginManagement {}`** block. ## Where it lives `pluginManagement {}` is a **settings-level** block: it goes in `settings.gradle.kts` (Kotlin DSL) or `settings.gradle` (Groovy), **not** in a project's `build.gradle.kts`. The settings file is evaluated once, at the very start of the build, before any project is configured. That is exactly why plugin repositories must be declared here — they have to be known before the first `plugins {}` block in any build script runs. ## The ordering rule Gradle requires `pluginManagement {}` to be the **first** block in the settings file. It must come before: - `plugins {}` (settings plugins), - `dependencyResolutionManagement {}`, - `include(":app")` / `includeBuild(...)`, - `rootProject.name = ...`. If you place it later, the build fails fast with a message like *"pluginManagement {} block must appear before any other statements in the script"*. This is because Gradle parses the script top-to-bottom and the plugin-resolution machinery has to be configured before it processes anything that could trigger plugin resolution. ## What goes inside The most common content is a `repositories {}` block: ```kotlin pluginManagement { repositories { gradlePluginPortal() mavenCentral() } } ``` It can also hold `resolutionStrategy {}` (to remap or pin plugin versions) and `includeBuild("...")` to source a plugin from a local included build. The repositories listed here are **distinct** from the dependency repositories you configure in `dependencyResolutionManagement {}` or in build scripts — those resolve library dependencies, not plugins. ## Key takeaway Think of `pluginManagement {}` as the settings-level switchboard for **where plugins come from**, and remember the one hard rule: it is the first thing in the settings file.

  • Why does pluginManagement have to be the first block in settings?
    Because Gradle evaluates the settings file top-to-bottom and the plugin-resolution machinery must be configured before any statement that could trigger plugin resolution; Gradle enforces this and fails the build if it appears later.
  • Can pluginManagement go in build.gradle.kts?
    No. It is a settings-level construct and only takes effect in settings.gradle(.kts). Putting it in a build script has no effect.

saying these in an interview costs you the question

  • Claiming pluginManagement goes in build.gradle.kts.
  • Saying its order in the settings file doesn't matter.
  • Confusing plugin repositories with dependency (library) repositories.

context

open as a page

Inside pluginManagement, how do you configure plugin repositories, and what is the default if you don't?

level: middleimportance: must knowfreq 55%

basics

~10 s

Add a repositories {} block inside pluginManagement {} and call helpers like gradlePluginPortal() and mavenCentral(). If you declare none, Gradle defaults to the Gradle Plugin Portal only.

open as a page

A build fails with 'pluginManagement {} block must appear before any other statements'. What caused it and how do you fix it?

level: juniorimportance: should knowfreq 33%

basics

~10 s

Something in settings.gradle.kts comes before the pluginManagement {} block — often rootProject.name, include, or a plugins {} block. Move pluginManagement to the very top of the file.

open as a page

How does pluginManagement differ from dependencyResolutionManagement, and how do they coexist in settings?

level: middleimportance: should knowfreq 44%

basics

~10 s

pluginManagement configures repositories and rules for resolving Gradle plugins; dependencyResolutionManagement configures repositories for resolving library dependencies. They are separate settings blocks with separate repository lists.

open as a page

How do you make pluginManagement resolve a plugin from a local included build instead of a repository?

level: seniorimportance: should knowfreq 38%

basics

~10 s

Put includeBuild("build-logic") inside pluginManagement {}. Gradle then resolves the plugin from that local build by matching its declared plugin id, instead of downloading it from a repository.

open as a page