RepoPilotOpen in app →

spring-projects/spring-boot

Spring Boot helps you to create Spring-powered, production-grade applications and services with absolute minimum fuss.

WAIT

Mixed signals — read the receipts

  • Last commit today
  • 5 active contributors
  • Apache-2.0 licensed
  • CI configured
  • Tests present
  • Small team — 5 top contributors
  • Concentrated ownership — top contributor handles 51% of commits

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Embed this verdict

[![RepoPilot: WAIT](https://repopilot.app/api/badge/spring-projects/spring-boot)](https://repopilot.app/r/spring-projects/spring-boot)

Paste into your README — the badge live-updates from the latest cached analysis.

Onboarding doc

Onboarding: spring-projects/spring-boot

Generated by RepoPilot · 2026-05-05 · Source

Verdict

WAIT — Mixed signals — read the receipts

  • Last commit today
  • 5 active contributors
  • Apache-2.0 licensed
  • CI configured
  • Tests present
  • ⚠ Small team — 5 top contributors
  • ⚠ Concentrated ownership — top contributor handles 51% of commits

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

TL;DR

Spring Boot is the official opinionated bootstrapping framework for Spring-based Java/Kotlin applications. It provides auto-configuration, embedded servers (Tomcat, Jetty, Undertow), production-ready actuator endpoints, and a Gradle/Maven plugin (see .github/actions/publish-gradle-plugin/build.gradle) that packages apps as executable JARs or WARs — eliminating boilerplate XML config and manual dependency wiring. Monorepo built with Gradle: core modules live under spring-boot-project/ (inferred from standard Spring Boot layout), the Gradle plugin is published via .github/actions/publish-gradle-plugin/build.gradle as org.springframework.boot:spring-boot-gradle-plugin, and CI/CD is fully automated through .github/workflows/ with separate pipelines for snapshots, milestones, releases, system tests, and CodeQL analysis.

Who it's for

Java and Kotlin backend engineers who build microservices, REST APIs, batch jobs, or full-stack Spring applications and want convention-over-configuration defaults with the ability to override them. Also targets platform teams managing Spring dependency upgrades across organizations.

Maturity & risk

Spring Boot is one of the most widely adopted Java frameworks in existence, maintained by VMware/Broadcom's Spring team since 2013. The repo has extensive CI pipelines across .github/workflows/ (ci.yml, build-and-deploy-snapshot.yml, release.yml, run-system-tests.yml) and 29M+ lines of Java source indicating a massive, battle-tested codebase. Verdict: production-ready and actively developed.

Extremely low risk for production use — it is backed by Broadcom/Spring team with dedicated full-time engineers, regular milestone/GA releases tracked in .github/workflows/release-milestone.yml and release.yml, and synced to Maven Central via .github/actions/sync-to-maven-central. The main risk is major version upgrade friction (e.g., Spring Boot 2→3 required Jakarta EE namespace migration), and the sheer size (29M+ lines of Java) means deep customizations require significant framework knowledge.

Active areas of work

Active workflows include snapshot deployment (build-and-deploy-snapshot.yml on main branch), Homebrew tap updates (.github/actions/update-homebrew-tap/action.yml), SDKMan publishing (.github/actions/publish-to-sdkman/action.yml), and Develocity-integrated Gradle build scans. The dependabot.yml indicates automated dependency PR generation is active. CodeQL analysis (run-codeql-analysis.yml) is running continuously for security.

Get running

git clone https://github.com/spring-projects/spring-boot.git cd spring-boot

Build the entire project (requires JDK 17+)

./gradlew build

Build skipping tests for speed

./gradlew build -x test

Run a specific subproject's tests

./gradlew :spring-boot-project:spring-boot-autoconfigure:test

Daily commands: ./gradlew build

To run the Spring Boot Gradle plugin tests specifically:

./gradlew :spring-boot-project:spring-boot-tools:spring-boot-gradle-plugin:test

To publish plugin locally for testing:

./gradlew :spring-boot-project:spring-boot-tools:spring-boot-gradle-plugin:publishToMavenLocal

Map of the codebase

How to make changes

Auto-configuration changes: spring-boot-project/spring-boot-autoconfigure/src/main/java/. New starter: create a new module under spring-boot-project/spring-boot-starters/. Actuator endpoints: spring-boot-project/spring-boot-actuator/. Gradle plugin behavior: spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/. Tests mirror the main source tree. Start by reading an existing @Configuration class with @ConditionalOnClass to understand the auto-config pattern.

Traps & gotchas

  1. JDK version: building requires JDK 17 minimum; using JDK 21+ may expose additional test behaviors. 2) The Gradle build uses Develocity (formerly Gradle Enterprise) scan integration — you need to accept the terms or disable via --no-scan or the build may prompt/fail in offline environments. 3) .github/actions/prepare-gradle-build/action.yml injects specific Gradle properties for CI that differ from local builds — reproduce CI failures by checking that action. 4) The .git-blame-ignore-revs file must be configured locally (git config blame.ignoreRevsFile .git-blame-ignore-revs) to get meaningful git blame output, as large formatting commits are excluded.

Concepts to learn

  • Auto-configuration with @Conditional — The entire Spring Boot magic of 'zero config' is implemented through @ConditionalOnClass, @ConditionalOnMissingBean, etc. — understanding this is mandatory to debug why a bean is or isn't created.
  • Fat JAR / Uber JAR packaging — Spring Boot's Gradle plugin repackages the application into a single executable JAR with a custom classloader (JarLauncher) — this is non-standard JAR behavior and causes issues when used as a library dependency.
  • Spring Boot Actuator health endpoints — Production-grade health checks, metrics (via Micrometer), and info endpoints are provided out-of-the-box — these integrate directly with Kubernetes liveness/readiness probes.
  • Ahead-of-Time (AOT) compilation for GraalVM Native Image — Spring Boot 3.x added AOT processing to generate reflection hints and proxy configurations at build time, enabling compilation to native binaries — this fundamentally changes how beans are discovered.
  • Externalized Configuration and Property Binding — Spring Boot's hierarchical property resolution (application.properties → environment variables → command-line args) with type-safe @ConfigurationProperties binding is central to every deployment configuration decision.
  • Gradle Plugin Portal publishing (com.gradle.plugin-publish) — The build.gradle in .github/actions/publish-gradle-plugin uses the publishExisting task from com.gradle.plugin-publish 1.2.1 — understanding this plugin's artifact promotion model is required to modify the Spring Boot Gradle plugin release process.
  • Spring Factories / AutoConfiguration imports mechanism — Prior to Boot 3, auto-configurations were registered in META-INF/spring.factories; Boot 3 migrated to META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports — knowing the difference is critical when reading older tutorials or debugging missing configs.

Related repos

  • spring-projects/spring-framework — The core Spring Framework that Spring Boot builds on top of — auto-configuration, dependency injection, and MVC all originate here.
  • spring-projects/spring-boot-starter-parent — The parent POM for Maven-based Spring Boot projects, providing default dependency management versions aligned with each Boot release.
  • quarkus/quarkus — Direct alternative in the Java ecosystem targeting the same microservice/cloud-native use case with compile-time optimization instead of Boot's runtime auto-configuration.
  • micronaut-projects/micronaut-core — Another production-grade Java framework solving the same problem as Spring Boot but with ahead-of-time (AOT) compilation and lower memory footprint.
  • spring-attic/spring-boot-cli — The Spring Boot CLI predecessor/companion tool referenced in the README for running Spring scripts from the command line.

PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add a GitHub Actions workflow for verifying Gradle plugin publication integrity

The repo has a .github/actions/publish-gradle-plugin/ action with artifacts.spec and a custom build.gradle, but there is no dedicated CI workflow that dry-runs or verifies the plugin publication process against the Gradle Plugin Portal sandbox. The publishExisting task in build-plugin/spring-boot-antlib references com.gradle.plugin-publish 1.2.1, and a verification workflow would catch regressions in the publication pipeline before a real release. This is especially valuable given the custom PublishExistingTask used instead of the standard publish flow.

  • [ ] Create .github/workflows/verify-gradle-plugin-publish.yml that triggers on PRs touching build-plugin/** or .github/actions/publish-gradle-plugin/**
  • [ ] In the workflow, invoke the prepare-gradle-build action (.github/actions/prepare-gradle-build/action.yml) to set up the Gradle environment
  • [ ] Run ./gradlew publishExisting --dry-run (or a validation-only variant) against the build-plugin/spring-boot-antlib/build.gradle to confirm task wiring and artifact resolution
  • [ ] Parse and validate artifacts.spec (.github/actions/publish-gradle-plugin/artifacts.spec) to assert all declared artifacts exist after the build step
  • [ ] Add a job summary step that prints the resolved plugin coordinates and version to make failures easier to diagnose

Add integration test for the Ant + Ivy sample under build-plugin/spring-boot-antlib/src/it/sample

The build-plugin/spring-boot-antlib/src/it/sample/ directory contains a hand-written build.xml and ivysettings.xml, indicating an Ant-based integration test scenario. However, there is no evidence of a CI workflow or Gradle task that actually executes this integration test in the current file listing. Ant/Ivy is a niche but still-used build system, and regressions in the antlib would go undetected. Adding an automated execution step prevents silent breakage for users who rely on spring-boot-antlib.

  • [ ] Inspect build-plugin/spring-boot-antlib/build.gradle and add a Gradle task (e.g., integrationTest) that invokes ant -f src/it/sample/build.xml using Gradle's Exec task type
  • [ ] Ensure the task depends on the antlib JAR being built first, so the sample picks up the locally built artifact via the ivysettings.xml local resolver
  • [ ] Add assertions (e.g., check that the expected executable JAR is produced in the sample's output directory) so the task fails visibly on regression
  • [ ] Wire the new integrationTest task into the .github/workflows/ci.yml or .github/workflows/verify.yml workflow so it runs on every PR
  • [ ] Document the manual invocation steps in a comment inside build-plugin/spring-boot-antlib/build.gradle so future contributors understand the intent

Add a reclaim-docker-diskspace step to the build-pull-request.yml workflow to mirror the pattern already used in other workflows

The script .github/scripts/reclaim-docker-diskspace.sh exists and is presumably called in some workflows (e.g., system tests or snapshot builds) to free disk space before large Docker-based build steps. However, build-pull-request.yml is a high-frequency workflow triggered on every PR and is highly likely to hit disk-space limits during integration tests that spin up containers (e.g., Testcontainers-based tests common in Spring Boot). Adding the reclaim step here would reduce flaky 'no space left on device' failures for contributors.

  • [ ] Open .github/workflows/build-pull-request.yml and identify the job steps that precede Docker

Good first issues

  1. Add missing integration test coverage for a specific auto-configuration class in spring-boot-autoconfigure that currently only has unit tests — check for @ConditionalOnClass configs that lack @SpringBootTest-based tests. 2) Improve the Gradle plugin's publishExisting task documentation in .github/actions/publish-gradle-plugin/build.gradle by adding inline comments explaining the fileRepositoryRoot and pluginCoordinates parameters. 3) Add a Dockerfile example to the getting-started documentation — the repo has Dockerfile support (Dockerfile language detected) but the .github/ISSUE_TEMPLATE/issue.md doesn't guide users on container-specific problems.

Top contributors

Recent commits

  • 607e4bb — Merge pull request #50271 from vpavic (snicoll)
  • 627ac04 — Polish "Handle lazy connection proxy datasource in DataSourceBuilder" (snicoll)
  • 460318e — Handle lazy connection proxy datasource in DataSourceBuilder (vpavic)
  • 96a36cf — Merge branch '4.0.x' (snicoll)
  • 2c18012 — Merge branch '3.5.x' into 4.0.x (snicoll)
  • f5203cf — Merge pull request #50235 from kwondh5217 (snicoll)
  • 9d7b21a — Remove MeterRegistry from global registry on context close (kwondh5217)
  • d7e49dc — Merge branch '4.0.x' (snicoll)
  • 1ec3039 — Merge pull request #50281 from mmoayyed (snicoll)
  • cce0142 — Polish "Add links for Java CAS Client Spring Boot Starter" (snicoll)

Security observations

The Spring Boot repository demonstrates a generally mature security posture as a well-maintained open-source project with established CI/CD pipelines, license management, and code review processes. However, several moderate concerns exist: the GitHub Actions pipeline may be susceptible to supply-chain risk via non-SHA-pinned actions; dynamic variable interpolation in the Gradle publish script warrants scrutiny; and multiple sensitive deployment workflows require careful auditing for safe secret handling. No hardcoded credentials or direct injection vulnerabilities are

  • Medium · Unpinned Third-Party GitHub Actions — .github/workflows/ and .github/actions/. The GitHub Actions workflows reference actions and composite actions (e.g., actions/build, actions/prepare-gradle-build, etc.) without commit-SHA pinning. This exposes the CI/CD pipeline to supply-chain attacks where a compromised or updated action tag could execute arbitrary code in the build environment, potentially leaking secrets or injecting malicious artifacts. Fix: Pin all third-party and internal GitHub Actions to a specific immutable commit SHA (e.g., uses: actions/checkout@<full-sha>) rather than mutable tags or branch names. Use a tool like Dependabot or Renovate to keep SHA pins up to date.
  • Medium · Dynamic Variable Interpolation in Gradle Build Script — .github/actions/publish-gradle-plugin/build.gradle. The Gradle build script uses string interpolation for sensitive build-time values such as ${repositoryRoot}, ${bootVersion}, and coordinates passed to PublishExistingTask. If these values are derived from unvalidated environment variables or user-controlled input at build time, they could lead to path traversal, artifact substitution, or unintended publication of artifacts to incorrect repositories. Fix: Validate and sanitize all externally supplied Gradle properties before use. Prefer explicitly declared, version-controlled property files over environment variable injection where possible. Audit the CI pipeline to ensure repositoryRoot and bootVersion cannot be tampered with by untrusted sources.
  • Medium · Potential Secret Exposure via GitHub Actions Workflows — .github/workflows/. Multiple workflow files exist (ci.yml, release.yml, distribute.yml, build-and-deploy-snapshot.yml, etc.) that likely consume repository secrets (e.g., publish credentials, signing keys, SDKMan tokens, Maven Central credentials). If any workflow is triggered by pull_request_target or processes untrusted user input without isolation, secrets could be exfiltrated by a malicious pull request. Fix: Audit all workflows for pull_request_target triggers combined with actions that check out PR code. Ensure secrets are not passed to jobs that execute untrusted code. Use environment-scoped secrets with required reviewers for sensitive deployment workflows. Consider using OpenID Connect (OIDC) instead of long-lived credentials where supported.
  • Low · Sensitive Artifact Publishing Coordinates Hardcoded in Build Script — .github/actions/publish-gradle-plugin/build.gradle. The plugin coordinates (org.springframework.boot:spring-boot-gradle-plugin) and publishing metadata are hardcoded in the Gradle build file. While not a secret, the static declaration of plugin IDs and coordinates alongside dynamic version injection could allow version spoofing if the build environment is compromised. Fix: Ensure the build environment is trusted and isolated. Consider separating publication configuration from version resolution to reduce the blast radius of a compromised build environment.
  • Low · Presence of .idea Directory in Repository — .idea/. IDE-specific configuration files (.idea/ directory) are committed to the repository, including copyright profiles, code style configurations, and inspection profiles. While not directly exploitable, these files can reveal internal tooling configurations, coding conventions, and potentially sensitive project metadata that aids in targeted attacks. Fix: Add the .idea/ directory to .gitignore to prevent IDE metadata from being tracked in version control. Share only intentional project-level settings via dedicated configuration files if needed.
  • Low · Missing Security Policy / SECURITY.md — Repository root / .github/. No SECURITY.md file is visible in the repository root or .github directory. Without a security policy, vulnerability reporters may not know how to responsibly disclose issues, potentially leading to public disclosure of unpatched vulnerabilities. Fix: Add a SECURITY.md file to the repository root or .github/ directory that clearly defines the security disclosure process, supported versions, and contact information for responsible disclosure.

LLM-derived; treat as a starting point, not a security audit.

Where to read next


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

WAIT · spring-projects/spring-boot — RepoPilot Verdict