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:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
|
||||||
Reference in New Issue
Block a user