resilience: prove spring-boot-starter-aop was renamed to spring-boot-starter-aspectj, not removed

Maven Central's maven-metadata.xml for both artifact IDs, read together, shows aop's last
release is 4.0.0-M2 and aspectj's first release is 4.0.0-M3 -- a rename at a milestone
boundary, not a drop. The renamed starter's own published POM depends on exactly
spring-aop + aspectjweaver, the two jars this pom.xml's dependency comment already claimed
were needed; this commit adds the reproducible build-break proof, the metadata/POM evidence,
and a new doc chapter, and backs the corrected companion-repo links from the resilience4j-
circuit-breaker-spring-boot post.
This commit is contained in:
2026-09-18 08:34:06 +00:00
parent baff043748
commit 604291067e
9 changed files with 179 additions and 2 deletions
+1
View File
@@ -48,6 +48,7 @@ All of these are diagnostics for the article. Delete [`DemoController`](src/main
5. [Retry and transactions](docs/05-retry-and-transactions.md) 5. [Retry and transactions](docs/05-retry-and-transactions.md)
6. [What is left for Resilience4j](docs/06-what-is-left-for-resilience4j.md) 6. [What is left for Resilience4j](docs/06-what-is-left-for-resilience4j.md)
7. [Migrating from spring-retry](docs/07-migrating-from-spring-retry.md) 7. [Migrating from spring-retry](docs/07-migrating-from-spring-retry.md)
8. [`spring-boot-starter-aop` was renamed, not removed](docs/08-starter-aop-renamed-to-starter-aspectj.md) - also backs the sibling post [Resilience4j Circuit Breaker in Spring Boot 4.1](https://ankurm.com/resilience4j-circuit-breaker-spring-boot/)
## Findings worth the trip ## Findings worth the trip
+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- NOT part of the main build (no parent module lists this directory). Exists only so
scripts/reproduce-starter-aop-break.sh can run `mvn compile` against it and capture
the real error. See docs/01-two-resilience-stacks.md. -->
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.1.1</version>
<relativePath/>
</parent>
<groupId>com.ankurm</groupId>
<artifactId>break-demo</artifactId>
<version>1.0.0</version>
<dependencies>
<!-- This is the dependency every pre-Boot-4 Resilience4j guide tells you to add.
It no longer exists past 4.0.0-M2. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
</project>
@@ -1,6 +1,6 @@
# 7. Migrating from spring-retry # 7. Migrating from spring-retry
[← 6. What is left for Resilience4j](06-what-is-left-for-resilience4j.md) · [Index](../README.md) [← 6. What is left for Resilience4j](06-what-is-left-for-resilience4j.md) · [Index](../README.md) · [8. Starter rename: aop → aspectj →](08-starter-aop-renamed-to-starter-aspectj.md)
The spring-retry README now says the project "is no longer maintained as an open-source project" The spring-retry README now says the project "is no longer maintained as an open-source project"
and "has been superseded by Spring Framework 7". Its last release on Maven Central is 2.0.13. and "has been superseded by Spring Framework 7". Its last release on Maven Central is 2.0.13.
@@ -0,0 +1,59 @@
← [What is left for Resilience4j](06-what-is-left-for-resilience4j.md) | [Migrating from spring-retry](07-migrating-from-spring-retry.md) →
# `spring-boot-starter-aop` was renamed, not removed
Every pre-Boot-4 AOP or Resilience4j guide tells you to add `spring-boot-starter-aop` when an
annotation (`@Retryable`, `@ConcurrencyLimit`, Resilience4j's `@CircuitBreaker`, plain `@Aspect`
beans, anything proxy-based) needs AspectJ on the classpath. On Boot 4.1, adding that dependency
breaks the build before the application ever starts:
```
[ERROR] 'dependencies.dependency.version' for org.springframework.boot:spring-boot-starter-aop:jar is missing.
```
Captured by [`scripts/reproduce-starter-aop-break.sh`](../scripts/reproduce-starter-aop-break.sh)
against the minimal [`broken-example/pom.xml`](../broken-example/pom.xml), which adds only that
one dependency: [`00a-starter-aop-build-error.txt`](output/00a-starter-aop-build-error.txt).
## It was renamed, not dropped
It is tempting to read that error as "the starter is gone, assemble `spring-aop` and
`aspectjweaver` by hand instead" -- an earlier version of the sibling post this repo also serves
said exactly that. It is half right and half wrong. Maven Central's `maven-metadata.xml` for both
artifact IDs, read together, settles it:
[`00b-starter-aspectj-metadata-timeline.txt`](output/00b-starter-aspectj-metadata-timeline.txt).
`spring-boot-starter-aop`'s last-ever published version is `4.0.0-M2`. `spring-boot-starter-aspectj`'s
first-ever published version is `4.0.0-M3` -- the very next milestone in the same 4.0 line, and it
carries straight through to the 4.0.0 GA and every 4.1.x release since. That is a rename at a
specific milestone boundary, not an unrelated new artifact and not a starter dropped with nothing
replacing it.
The renamed starter's own published POM confirms it bundles exactly the two jars this module's
`pom.xml` needs:
[`00c-starter-aspectj-pom-dependencies.txt`](output/00c-starter-aspectj-pom-dependencies.txt).
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aspectj</artifactId>
</dependency>
```
is all this module adds (see [`pom.xml`](../pom.xml)) -- one line, version-managed by the parent
POM like any other starter, resolving to `spring-aop` + `aspectjweaver` underneath. Assembling
those two dependencies by hand still works and behaves identically, since it's what the starter
does anyway, but there's no longer a reason to: the starter has the same name shape as every
other Boot starter, it's just spelled `aspectj` instead of `aop` from the 4.0 line onward.
<blockquote>If you're on a build that still references <code>spring-boot-starter-aop</code> after
upgrading to Boot 4, the fix is a rename in your <code>pom.xml</code>, not a rewrite: swap the
<code>artifactId</code> to <code>spring-boot-starter-aspectj</code> and nothing else changes.</blockquote>
## Going deeper
- [`pom.xml`](../pom.xml) -- this module's own dependency, with the corrected comment
- Maven Central: [`spring-boot-starter-aop/maven-metadata.xml`](https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter-aop/maven-metadata.xml) and [`spring-boot-starter-aspectj/maven-metadata.xml`](https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter-aspectj/maven-metadata.xml) -- rel="nofollow"
- [Resilience4j Circuit Breaker in Spring Boot 4.1: What It's Still For](https://ankurm.com/resilience4j-circuit-breaker-spring-boot/) -- the sibling post this same correction applies to
← [What is left for Resilience4j](06-what-is-left-for-resilience4j.md) | [Migrating from spring-retry](07-migrating-from-spring-retry.md) →
@@ -0,0 +1,13 @@
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] 'dependencies.dependency.version' for org.springframework.boot:spring-boot-starter-aop:jar is missing. @ line 19, column 17
@
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]
[ERROR] The project com.ankurm:break-demo:1.0.0 (/home/claude/work/repos/spring-boot-demo-migration/resilience/broken-example/pom.xml) has 1 error
[ERROR] 'dependencies.dependency.version' for org.springframework.boot:spring-boot-starter-aop:jar is missing. @ line 19, column 17
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
@@ -0,0 +1,33 @@
Captured 2026-09-18 from repo1.maven.org (Maven Central), not an aggregator or blog.
--- org/springframework/boot/spring-boot-starter-aop/maven-metadata.xml ---
<latest>4.0.0-M2</latest>
<release>4.0.0-M2</release>
... version list ends at:
<version>3.5.16</version>
<version>4.0.0-M1</version>
<version>4.0.0-M2</version>
</versions>
<lastUpdated>20260625105758</lastUpdated>
--- org/springframework/boot/spring-boot-starter-aspectj/maven-metadata.xml ---
<latest>4.2.0-M1</latest>
<release>4.2.0-M1</release>
... version list starts at:
<version>4.0.0-M3</version>
<version>4.0.0-RC1</version>
<version>4.0.0-RC2</version>
<version>4.0.0</version>
<version>4.0.1</version>
...
<version>4.1.0</version>
<version>4.1.1</version>
<version>4.2.0-M1</version>
</versions>
<lastUpdated>20260820133928</lastUpdated>
Reading the two lists together: spring-boot-starter-aop's last-ever release is 4.0.0-M2.
spring-boot-starter-aspectj's first-ever release is 4.0.0-M3 -- the very next milestone in the
4.0 line. It then carries through 4.0.0-RC1, RC2, the 4.0.0 GA, every 4.0.x and 4.1.x patch, and
into the 4.2.0-M1 pre-release. That is a rename at a specific milestone boundary, not two
unrelated artifacts and not a starter that was dropped with nothing replacing it.
@@ -0,0 +1,35 @@
Captured 2026-09-18 from repo1.maven.org (Maven Central):
https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter-aspectj/4.1.1/spring-boot-starter-aspectj-4.1.1.pom
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aspectj</artifactId>
<version>4.1.1</version>
<name>spring-boot-starter-aspectj</name>
<description>Starter for using aspect-oriented programming with AspectJ</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>4.1.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>7.0.9</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.25.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
The renamed starter's own POM declares exactly spring-aop + aspectjweaver as compile
dependencies -- the same two jars this module's own pom.xml already lists as the reason it
depends on spring-boot-starter-aspectj. There is no missing third piece and no behavioural
difference from assembling the two jars by hand; the starter just does it for you, correctly
versioned, in one line.
+4 -1
View File
@@ -48,7 +48,10 @@
</dependency> </dependency>
<!-- Resilience4j: annotations are woven by its own aspects, so AspectJ must be present. <!-- Resilience4j: annotations are woven by its own aspects, so AspectJ must be present.
Boot 4 renamed spring-boot-starter-aop to spring-boot-starter-aspectj. --> Boot 4 renamed spring-boot-starter-aop to spring-boot-starter-aspectj (confirmed against
Maven Central's maven-metadata.xml for both artifact IDs and the renamed starter's own
published POM, which depends on exactly spring-aop + aspectjweaver, the two jars this
file used to add by hand before that was verified). See docs/08-starter-aop-renamed-to-starter-aspectj.md. -->
<dependency> <dependency>
<groupId>io.github.resilience4j</groupId> <groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot4</artifactId> <artifactId>resilience4j-spring-boot4</artifactId>
+9
View File
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
# Reproduces, and captures, the real build error from adding spring-boot-starter-aop on
# Spring Boot 4.1 -- the dependency every pre-Boot-4 Resilience4j / AOP guide tells you to add.
# See docs/08-starter-aop-renamed-to-starter-aspectj.md.
set -uo pipefail
cd "$(dirname "$0")/../broken-example"
mvn -B -q compile 2>&1 | grep -v '^Picked up\|^WARNING' > ../docs/output/00a-starter-aop-build-error.txt
echo "captured to docs/output/00a-starter-aop-build-error.txt:"
cat ../docs/output/00a-starter-aop-build-error.txt