Skills for creating, testing, reviewing, migrating and guarding Spring Boot 4 projects with Java 25: project scaffolding with architecture patterns, Boot 4 test templates, code review, Boot 3 to 4 migration, and a team harness of build gates and agent hooks.
93%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Don't move Java files by hand or with text edits: imports and references in other files go stale, and names in resources are missed.
$TMPDIR/move.yml, so nothing is left to commit:
type: specs.openrewrite.org/v1beta/recipe
name: local.Move
recipeList:
- org.openrewrite.java.ChangeType: # one class
oldFullyQualifiedTypeName: {{BASE_PACKAGE}}.orders.internal.Discounts
newFullyQualifiedTypeName: {{BASE_PACKAGE}}.catalog.internal.Discounts
# or, for a whole package and its subpackages:
# - org.openrewrite.java.ChangePackage:
# oldPackageName: {{BASE_PACKAGE}}.orders.internal
# newPackageName: {{BASE_PACKAGE}}.orders.pricing
# recursive: truetarget/rewrite/rewrite.patch before applying it:
./mvnw -q org.openrewrite.maven:rewrite-maven-plugin:6.46.1:dryRun -Drewrite.configLocation=$TMPDIR/move.yml -Drewrite.activeRecipes=local.Moverun instead of dryRun.$TMPDIR/rewrite.gradle, so the build files stay unchanged:
initscript {
repositories { gradlePluginPortal(); mavenCentral() }
dependencies { classpath "org.openrewrite:plugin:7.39.0" }
}
rootProject {
plugins.apply(org.openrewrite.gradle.RewritePlugin)
rewrite {
activeRecipe("local.Move")
configFile = new File(System.getProperty("moveRecipe"))
}
}build/reports/rewrite/rewrite.patch before applying it:
./gradlew -q rewriteDryRun --init-script $TMPDIR/rewrite.gradle -DmoveRecipe=$TMPDIR/move.ymlrewriteRun instead of rewriteDryRun.git grep -n '<old fully qualified name>'. A class name inside a Java string literal is not updated. Change each hit only if it names the moved type.{{VERIFY}}. A compile error naming a type from the old package means the moved class used package-private code there: move that code with it (move the whole package instead), or make it reachable on purpose. The module-boundary test reports a move that crosses a module boundary.git log --follow keeps the file's history.