Automate configuration metadata for @ConfigurationProperties modules - #16047
Automate configuration metadata for @ConfigurationProperties modules#16047jamesfredley wants to merge 10 commits into
Conversation
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
Assisted-by: opencode:gpt-5.6-sol
There was a problem hiding this comment.
Pull request overview
Introduces a new build-time pipeline to generate Spring Boot configuration metadata from compiled Groovy/Java @ConfigurationProperties classes, merging in curated additional-spring-configuration-metadata.json overlays and wiring the results into the docs config reference generation.
Changes:
- Adds
grails-configuration-metadatacompiler module with a Groovy SEMANTIC_ANALYSIS AST transformation to embed deterministic metadata payloads in compiled Groovy configuration classes. - Adds a Gradle build-logic plugin (
org.apache.grails.buildsrc.configuration-metadata) that scans compiled bytecode (ASM), merges curated overlays, and publishes a single standardMETA-INF/spring-configuration-metadata.jsonresource per jar. - Migrates existing curated metadata to
additional-spring-configuration-metadata.json, relocates CORS metadata ownership to URL Mappings, and expands the docs config-reference pipeline inputs.
Reviewed changes
Copilot reviewed 19 out of 22 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| settings.gradle | Includes new grails-configuration-metadata module in the multi-project build. |
| gradle/publish-root-config.gradle | Publishes the new grails-configuration-metadata module. |
| dependencies.gradle | Adds ASM to the build BOM dependencies for bytecode scanning. |
| build-logic/plugins/build.gradle | Adds ASM dependency and registers the new configuration metadata Gradle plugin. |
| build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/ConfigurationMetadataPlugin.groovy | Implements bytecode scanning + overlay merge + deterministic metadata output task wired into processResources. |
| build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/ConfigurationMetadataPluginSpec.groovy | TestKit coverage for clean/incremental/edit/deletion/overlay/duplicates/no-overlay behavior. |
| grails-configuration-metadata/build.gradle | New compiler module build definition and test dependencies. |
| grails-configuration-metadata/src/main/groovy/org/apache/grails/configuration/metadata/ConfigurationMetadataTransformation.groovy | Groovy AST transform embedding per-class metadata payloads (constant defaults only). |
| grails-configuration-metadata/src/main/resources/META-INF/services/org.codehaus.groovy.transform.ASTTransformation | Registers the global AST transformation. |
| grails-configuration-metadata/src/test/groovy/org/apache/grails/configuration/metadata/ConfigurationMetadataTransformationSpec.groovy | Unit tests validating payload shape, defaults policy, and reserved-field collision handling. |
| grails-cache/build.gradle | Applies the new configuration metadata build plugin. |
| grails-cache/src/main/resources/META-INF/additional-spring-configuration-metadata.json | Adds curated cache metadata overlay for merge with generated metadata. |
| grails-databinding/build.gradle | Applies the new configuration metadata build plugin. |
| grails-databinding/src/main/resources/META-INF/additional-spring-configuration-metadata.json | Adds curated data binding metadata overlay. |
| grails-views-gson/build.gradle | Applies the new configuration metadata build plugin. |
| grails-views-gson/src/main/resources/META-INF/additional-spring-configuration-metadata.json | Adds curated JSON Views metadata overlay. |
| grails-views-markup/build.gradle | Applies the new configuration metadata build plugin. |
| grails-web-url-mappings/build.gradle | Applies the new configuration metadata build plugin. |
| grails-web-url-mappings/src/main/resources/META-INF/additional-spring-configuration-metadata.json | Adds curated URL Mappings/CORS metadata overlay (migrated from web-core). |
| grails-web-core/src/main/resources/META-INF/spring-configuration-metadata.json | Removes CORS group/properties now owned by URL Mappings. |
| grails-doc/src/en/guide/conf/config.adoc | Documents how Grails produces/overlays configuration metadata and its defaults policy. |
| grails-doc/build.gradle | Adds migrated module jars as inputs to the configuration reference generation pipeline. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## 8.0.x #16047 +/- ##
==================================================
- Coverage 51.4910% 51.4794% -0.0117%
- Complexity 17762 17793 +31
==================================================
Files 2039 2040 +1
Lines 95537 95681 +144
Branches 16571 16610 +39
==================================================
+ Hits 49193 49256 +63
- Misses 39037 39084 +47
- Partials 7307 7341 +34
🚀 New features to boost your workflow:
|
✅ All tests passed ✅🏷️ Commit: b792a3f Learn more about TestLens at testlens.app. |
What this does
Closes #15469 for the five modules that already use
@ConfigurationProperties:grails-cachegrails-databindinggrails-views-gsongrails-views-markupgrails-web-url-mappings(CORS owner)Each publishes standard Spring Boot metadata at
META-INF/spring-configuration-metadata.jsonduring the module build. IDEs,config-report, and the Application Properties reference consume that resource.This is not Spring Boot's
spring-boot-configuration-processor. That approach was tried in #15566 and closed because Java annotation processors break incremental Groovy compilation. This PR uses a Grails-owned path instead:@ConfigurationPropertiesclass (no shared processor output).Migration details
spring-configuration-metadata.jsonrenamed toadditional-spring-configuration-metadata.json(overlay). Overlay values win for matching identities.8.0.x; generation now publishes bindable Markup Views properties.grails-web-coreintograils-web-url-mappingswithGrailsCorsConfiguration. Non-CORS web-core metadata stays hand-maintained ingrails-web-core.Generated defaults only include compile-time constants. Dynamic Groovy defaults are omitted unless an overlay supplies an authoritative value.
Compatibility check (against
origin/8.0.x)Re-verified on exact PR HEAD after regenerating metadata:
grails-web-core8.0.xfile)Each migrated jar contains exactly one standard metadata resource plus any curated additional metadata file.
Scope notes
@ConfigurationPropertiesmodules.DefaultSecurityConfig, generalapplication.groovymerging). Those remain later work.Verification
Local:
:grails-configuration-metadata:test+codeStyleConfigurationMetadataPluginSpec(clean, incremental, edit, delete, overlay, duplicate, immutable, generic-constructor safety)ConfigReportCommandSpec:grails-doc:publishGuide -x aggregateGroovydocCI on this PR: core builds (Linux/macOS), style/analysis/RAT/CodeQL/coverage, Forge, functional, security, Redis, MongoDB, and Hibernate suites are green. A few long jobs (Windows core, joint Groovy validation, selected functional reruns) were still finishing at description update time.
Commits
3-7. Per-module migrations (cache, databinding, gson, markup, URL mappings/CORS)
8-9. Docs reference inputs + guide prose