Companion code for "Deploying Spring Boot 4 on Kubernetes: Probes, Graceful
Shutdown, Limits and JVM Ergonomics". A dependency outage under three
probe-group setups, a rolling restart under load four ways (three runs
each), the JVM's ergonomic choices for nine pod shapes, one GC-heavy load
under five CPU limits with throttling counters, and an HPA driven by a
Micrometer gauge through prometheus-adapter. Measured on k3s v1.36.4.
Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01C3TETMrqVUWeFkNtz3Jbo3
Companion code for "Dockerizing Spring Boot 4: Layered Jars, Buildpacks,
Distroless and Image Size Benchmarks". Fat jar on JDK and JRE, layered jar
on Debian, Alpine and distroless, jlink, the JDK 25 AOT cache, Paketo
buildpacks and Jib, each measured for size on disk and pushed, rebuild
delta, startup, user and shell. Also PID 1 and signal handling, the jdeps
module gap, AOT cache mismatches and buildpacks memory calculation.
Transcripts in docs/output/, regenerated by scripts/run-all.sh.
Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01C3TETMrqVUWeFkNtz3Jbo3
configuration-properties/ @ConfigurationProperties vs @Value on Spring Boot 4.1.1.
The relaxed-binding matrix is generated by binding each spelling rather than
transcribed, and re-checked against real processes -- the in-process probe was
wrong twice before it was right. Records the three findings that came out of it:
@Value does get relaxed resolution inside Spring Boot (Boot attaches
ConfigurationPropertySources), the configuration processor silently stops
generating metadata on JDK 23+ when declared as a plain dependency, and @Valid is
not what makes nested constraints run.
profiles-and-config/ Precedence, profiles, spring.config.import and config trees.
/precedence reports every source holding a property in rank order with file and
line, which turns "my profile file had no effect" into a two-line answer. Also
pins the counterintuitive one: an imported file outranks the file that imported it.
spring-aop/ Designators, proxy types, and aspects that do not fire.
One advice per supported designator so the reference table is generated from real
matches; all fourteen unsupported designators fed to the parser. Two corrections to
the reference documentation: unsupported designators throw
UnsupportedPointcutPrimitiveException (extends RuntimeException, not
IllegalArgumentException), and spring-boot-starter-aop was renamed to
spring-boot-starter-aspectj in Boot 4.
19 contract tests across the three modules, 15 captured transcripts, all regenerated
by scripts/run-all.sh. Verified on Spring Boot 4.1.1, Spring Framework 7.0.9,
JDK 25.0.4.1.
Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Gip4srpzMwjgoba6uEfbr5
Adds spring-boot-startup-time/, the companion project for BLOG-618: a runnable
Spring Boot 4.1.1 application on JDK 25 that installs BufferingApplicationStartup
and FlightRecorderApplicationStartup behind a system property, and a /diag/startup
endpoint that computes step self time -- the number /actuator/startup does not give
you and the one that names the actual culprits.
Captured under docs/output/: the step tree sorted both ways, the same startup as JFR
events, a +5000-class experiment putting 0.11 ms per scanned class on the classpath
scan tax, the silent truncation a 2048-step buffer performs, and JDK 25 AOT cache
timings (6.93 s to 4.82 s). Post body and metadata live in post/.
Moves the existing Actuator project into actuator-in-production/ so the repository
holds one directory per article; the root README is now an index.
Companion repository for the ankurm.com article. Every transcript in docs/output/
was produced by running this project; scripts/run-all.sh regenerates all of them.
Verified against Spring Boot 4.1.1 / Framework 7.0.9 / Security 7.1.1 /
Micrometer 1.17.1 / kafka-clients 4.2.1 on Temurin JDK 25.0.4.1+1.