Migrate to Jackson 3.2.1 - #955
Conversation
Advance the `config` submodule to its `bump-jackson` tip, which migrates the `Jackson` dependency object to `tools.jackson:jackson-bom:3.2.1` (Jackson 3 group IDs; `jackson-annotations` deliberately stays on 2.x), and copy the resulting `buildSrc` delta into this repository. Also add the task plan for the migration. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Serialize a deterministic `UserAccount` through `io.spine.format.write` while the module is still on Jackson 2.22.1, and store the JSON and YAML outputs as test resources. After the migration to Jackson 3, round-trip tests parse these files to prove that data written by 2.x remains readable. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Move Jackson imports to the `tools.jackson.*` packages and adapt to the immutable mapper design of Jackson 3: - `JacksonSupport` now abstracts over a `MapperBuilder` instead of a `JsonFactory`: mappers cannot be configured after construction, so subclasses supply `JsonMapper.builder()` / `YAMLMapper.builder()`, and the base class registers shared modules and enables `INDENT_OUTPUT` on the builder before `build()`. - The shared `modules` list holds `JacksonModule`s (renamed from `Module` in 3.x) and is discovered via `MapperBuilder.findModules()` (the `ObjectMapper.findModules()` static is gone). - Parsers keep sharing the writers' mapper configuration, now via `mapperBuilder()` instead of a shared factory instance. - Drop the `jackson-datatype-jdk8` and `jackson-datatype-jsr310` dependencies: both are merged into `jackson-databind` in 3.x. - Correct `@throws` documentation: Jackson 3 throws the unchecked `JacksonException` instead of `IOException` subclasses; plain I/O failures and Protobuf-backed parsing still surface `IOException`. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add `Jackson2CompatibilitySpec`, which parses the JSON and YAML fixtures produced by Jackson 2.22.1 and asserts the values are read intact under Jackson 3.2.1, covering `java.time.Instant` (numeric epoch form), Guava collections, and JDK `Optional`. The only wire-format change of the migration, verified by diffing 2.x and 3.x outputs of the same value: `Instant` is now written as an ISO-8601 string instead of a numeric epoch value (`DateTimeFeature`, ex-`WRITE_DATES_AS_TIMESTAMPS`, is now disabled by default). Numeric values written by 2.x remain parseable, as these tests demonstrate. Property order is unchanged: constructor-bound Kotlin properties keep declaration order in Jackson 3. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Regenerated by `build` after the move to `tools.jackson` 3.2.1 coordinates and the removal of the `jdk8` and `jsr310` datatype modules, which Jackson 3 merged into `jackson-databind`. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add a team-memory note about the silent `*Test`/`*Spec` class-name filter of the shared `test` task, discovered while generating the Jackson 2 fixtures. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Extend the `@throws tools.jackson.core.JacksonException` tags with "or its subclass" — Jackson 3 throws concrete subtypes such as `StreamReadException` and `DatabindException` — matching the phrasing of the neighboring `IOException` tags. In `Jackson2CompatibilitySpec`, backtick the `@DisplayName` subject as sibling specs do, load fixtures via `Class.getResource`, and reflow a widow line in the class KDoc. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Drop the mutable shared module list from `JacksonSupport`: mappers now call `MapperBuilder.findAndAddModules()`, so modules are contributed by exposing them as `ServiceLoader` services (e.g., via `@AutoService`) instead of mutating a public list. This removes the companion object — and with it the registration-timing and concurrent-modification hazards of the former API. Removing the published `modules` property is a breaking change covered by the version bump to `2.0.0-SNAPSHOT.430`. Also apply review feedback to the KDoc: state that new formats are added within the Spine SDK (the `Format` hierarchy is sealed), fix the sentence wrongly attributing other formats to `YAMLMapper`, and note that `java.time` values are now written as ISO-8601 strings while data written by Jackson 2 remains readable. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Migrates the repository’s Jackson usage from Jackson 2.x (com.fasterxml.jackson.*) to Jackson 3.2.1 (tools.jackson.*), focusing on the format module’s JSON/YAML I/O implementation and updating generated dependency reports and versioning to reflect the breaking API change.
Changes:
- Migrated
formatJSON/YAML parsing/writing to Jackson 3’stools.jackson.*packages using immutable mapper builders andServiceLoader-based module discovery. - Added Jackson 2 compatibility fixtures + a regression spec ensuring Jackson 2-written files still parse under Jackson 3.
- Bumped published version and refreshed dependency-report artifacts; removed stale/generated root-level
pom.xml.
Reviewed changes
Copilot reviewed 146 out of 151 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| version.gradle.kts | Bumps published version to .430. |
| pom.xml | Removes stale generated root dependency report. |
| format/build.gradle.kts | Switches format deps to Jackson 3 BOM + trims removed datatype modules. |
| format/src/main/kotlin/io/spine/format/JacksonSupport.kt | Refactors Jackson support to mapper builders + ServiceLoader module discovery. |
| format/src/main/kotlin/io/spine/format/Parse.kt | Updates public KDoc @throws for Jackson 3 exception types. |
| format/src/main/kotlin/io/spine/format/parse/Parser.kt | Updates parser API KDoc @throws for Jackson-backed formats. |
| format/src/main/kotlin/io/spine/format/parse/JacksonParser.kt | Migrates parser implementation to tools.jackson.* mappers/builders. |
| format/src/main/kotlin/io/spine/format/write/JacksonWriter.kt | Migrates writer implementation to tools.jackson.* mappers/builders. |
| format/src/test/kotlin/io/spine/format/Jackson2CompatibilitySpec.kt | Adds coverage ensuring Jackson 2 fixtures remain readable under Jackson 3. |
| format/src/test/resources/io/spine/format/given/v2/user-account.json | Adds Jackson 2 JSON fixture for compatibility tests. |
| format/src/test/resources/io/spine/format/given/v2/user-account.yaml | Adds Jackson 2 YAML fixture for compatibility tests. |
| docs/dependencies/pom.xml | Refreshes generated dependency POM (now includes tools.jackson:* artifacts). |
| docs/dependencies/dependencies.md | Refreshes generated dependency/license report output. |
| buildSrc/src/main/resources/dokka/styles/custom-styles.css | Config sync (copyright year). |
| buildSrc/src/main/kotlin/write-manifest.gradle.kts | Config sync (wording tweaks). |
| buildSrc/src/main/kotlin/uber-jar-module.gradle.kts | Config sync (typo + task API usage). |
| buildSrc/src/main/kotlin/test-module.gradle.kts | Config sync (copyright year). |
| buildSrc/src/main/kotlin/Strings.kt | Config sync (doc wording). |
| buildSrc/src/main/kotlin/pmd-settings.gradle.kts | Config sync (copyright year). |
| buildSrc/src/main/kotlin/module-testing.gradle.kts | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/kmp-publish.gradle.kts | Config sync (copyright year). |
| buildSrc/src/main/kotlin/kmp-module.gradle.kts | Config sync (KDoc wording + suppression removal). |
| buildSrc/src/main/kotlin/io/spine/gradle/testing/Multiproject.kt | Config sync (typo fix). |
| buildSrc/src/main/kotlin/io/spine/gradle/testing/Logging.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/TaskName.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/StringExtensions.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/RunGradle.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/RunBuild.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/pom/SpineLicense.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ProjectMetadata.kt | Refactors metadata retrieval helpers (config sync). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomXmlWriter.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomFormatting.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ModuleDependency.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/pom/MarkupExtensions.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/pom/InceptionYear.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyScope.kt | Config sync (comment punctuation). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/license/Template.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/license/Tasks.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/license/ProjectDependencies.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/license/MarkdownReportRenderer.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt | Adjusts report paths + opts out of build cache for report task. |
| buildSrc/src/main/kotlin/io/spine/gradle/report/license/Configuration.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/KoverConfig.kt | Removes unused import (config sync). |
| buildSrc/src/main/kotlin/io/spine/gradle/repo/RepoSlug.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/repo/Credentials.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/publish/StandardJavaPublicationHandler.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingRepos.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingExts.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt | Config sync (punctuation). |
| buildSrc/src/main/kotlin/io/spine/gradle/publish/ProtoExts.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudRepo.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudArtifactRegistry.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Publish.kt | Config sync (typo fix: NPM). |
| buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/IntegrationTest.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/Protobuf.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/McJs.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/JsPlugins.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/Idea.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsExtension.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsEnvironment.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsContext.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocTag.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocConfig.kt | Config sync (KDoc wording/formatting). |
| buildSrc/src/main/kotlin/io/spine/gradle/javadoc/ExcludeInternalDoclet.kt | Config sync (hyphenation). |
| buildSrc/src/main/kotlin/io/spine/gradle/javadoc/Encoding.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/javac/Javac.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/javac/ErrorProne.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/java/Tasks.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPagesExtension.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/github/pages/Update.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/github/pages/AuthorEmail.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/git/UserInfo.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/git/Repository.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/git/Branch.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/dart/task/Publish.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/dart/task/IntegrationTest.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/dart/task/DartTasks.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/dart/task/Build.kt | Config sync (typo fixes). |
| buildSrc/src/main/kotlin/io/spine/gradle/dart/plugin/Protobuf.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/dart/plugin/DartPlugins.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/dart/DartExtension.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/dart/DartEnvironment.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/dart/DartContext.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/gradle/ConfigTester.kt | Config sync (KDoc wording/punctuation). |
| buildSrc/src/main/kotlin/io/spine/gradle/Clean.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/checkstyle/CheckStyleConfig.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/Build.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/gradle/base/Tasks.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/docs/MarkdownDocument.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/test/TestKitTruth.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/test/Testcontainers.kt | Updates Testcontainers coordinates/version (config sync). |
| buildSrc/src/main/kotlin/io/spine/dependency/test/SystemLambda.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/test/OpenTest4J.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/test/Kover.kt | Bumps Kover version constant. |
| buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/test/Hamcrest.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/test/AssertK.kt | Config sync (KDoc punctuation). |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt | Updates local Validation dep constants. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt | Updates ToolBase versions. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt | Updates Time version. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Spine.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Reflect.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt | Config sync (comment wording). |
| buildSrc/src/main/kotlin/io/spine/dependency/local/ModelCompiler.kt | Removes ModelCompiler dependency object. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt | Updates Logging version. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt | Updates CoreJvm version. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt | Updates compiler artifacts/versions + renames fat CLI coordinate. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Change.kt | Updates Change version. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/BaseTypes.kt | Updates BaseTypes version. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt | Updates Base versions. |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/Slf4J.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/Roaster.kt | Removes outdated Java 11 note. |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/Protobuf.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinX.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/Klaxon.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaX.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaPoet.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaJwt.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt | Updates Jackson dependency object to Jackson 3 + documents annotations exception. |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/Coroutines.kt | Config sync (typo fix). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/BouncyCastle.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/Asm.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/AppEngine.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/ApacheHttp.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/Serialization.kt | Config sync (spacing fix). |
| buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/KotlinX.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/io/spine/dependency/Dependency.kt | Config sync (whitespace fix). |
| buildSrc/src/main/kotlin/io/spine/dependency/boms/BomsPlugin.kt | Config sync (typo fix). |
| buildSrc/src/main/kotlin/io/spine/dependency/boms/Boms.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/DokkaExts.kt | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/DocumentationSettings.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/detekt-code-analysis.gradle.kts | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/DependencyResolution.kt | Config sync (hyphenation). |
| buildSrc/src/main/kotlin/config-tester.gradle.kts | Config sync (KDoc wording). |
| buildSrc/src/main/kotlin/BuildSettings.kt | Config sync (copyright year). |
| buildSrc/src/main/kotlin/BuildExtensions.kt | Adds helper to exclude JetBrains annotations from published deps. |
| buildSrc/build.gradle.kts | Clarifies buildSrc Jackson 2 decoupling + bumps Kover version. |
| buildSrc/settings.gradle.kts | Config sync (copyright year). |
| buildSrc/quality/checkstyle.xml | Config sync (copyright year). |
| buildSrc/quality/checkstyle-suppressions.xml | Config sync (copyright year). |
| .idea/live-templates/README.md | Formatting tweak (IDE metadata). |
| .github/workflows/gradle-wrapper-validation.yml | Removes wrapper validation workflow file. |
| .agents/tasks/bump-jackson.md | Adds migration task log (agent metadata). |
| .agents/memory/MEMORY.md | Adds link to new memory entry (agent metadata). |
| .agents/memory/feedback/test-class-name-filter.md | Adds new memory note about test class name filtering (agent metadata). |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Requested by the Copilot review: multiple similarly named annotations exist, so the example now states it means `com.google.auto.service.AutoService` from Google Auto Service. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 146 out of 151 changed files in this pull request and generated no new comments.
Suppressed comments (1)
format/src/main/kotlin/io/spine/format/JacksonSupport.kt:58
- In the KDoc instructions,
[Format]is linked twice in a row (“extends [Format], nesting it under the [Format] class”). This is a minor readability issue and one of the links can be replaced with plain code formatting to avoid repetition.
Replace the second `[Format]` link with plain prose (flagged by both the `review-docs` gate and the Copilot review), and de-duplicate the "other ... other" phrasing in the `mapperBuilder` documentation — the last two cosmetic items disclosed in the pull request description. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #955 +/- ##
===========================================
+ Coverage 0 94.01% +94.01%
===========================================
Files 0 194 +194
Lines 0 4177 +4177
Branches 0 345 +345
===========================================
+ Hits 0 3927 +3927
- Misses 0 149 +149
- Partials 0 101 +101 🚀 New features to boost your workflow:
|
Migrates the repository from Jackson 2.22.1 (
com.fasterxml.jackson) to Jackson 3.2.1 (tools.jackson), following the Jackson 3 migration brief (config/docs/jackson-3-migration-brief.md).What changed
configsubmodule points at itsbump-jacksontip, andbuildSrcis synced from it: theJacksondependency object now servestools.jackson:jackson-bom:3.2.1— confirmed the newest 3.2.x.jackson-annotationsdeliberately stays on 2.x (BOM-resolved to 2.22), the onlycom.fasterxmlartifact on the runtime classpath.formatmodule is migrated to thetools.jackson.*packages and Jackson 3's immutable mappers:JacksonSupportabstracts over aMapperBuilder(JsonMapper.builder()/YAMLMapper.builder()) instead of a sharedJsonFactory; parsers keep sharing the writers' mapper configuration. Thejackson-datatype-jdk8and-jsr310dependencies are removed — both merged intojackson-databindin 3.x.ServiceLoader-only viaMapperBuilder.findAndAddModules(). The public mutableJacksonSupport.moduleslist is removed; modules are contributed by exposing them as services, e.g., with@AutoService(JacksonModule::class).@throwsdocumentation is corrected: Jackson 3 throws the uncheckedJacksonException(and subclasses) instead ofIOException;IOExceptionremains accurate for file reading and the Protobuf-backed formats.2.0.0-SNAPSHOT.426->2.0.0-SNAPSHOT.430(breaking-change rounding per the version policy).Wire format
The only serialization change vs. 2.22.1, established by byte-diffing outputs of the same value:
java.timetypes are now written as ISO-8601 strings instead of numeric epoch values (DateTimeFeature.WRITE_DATES_AS_TIMESTAMPSis off by default in 3.x). Property order for Kotlin data classes is unchanged (constructor properties keep declaration order), and YAML output is otherwise byte-identical despite the switch to snakeyaml-engine. Fixtures generated under 2.22.1 are committed as test resources, andJackson2CompatibilitySpecproves they still parse correctly under 3.2.1. All 3.x changed defaults are accepted (none restored); the decision log lives in.agents/tasks/bump-jackson.md.Breaking changes
JacksonSupport.Companion.modules(MutableList<Module>) is removed.formatAPI move fromcom.fasterxml.jackson.*totools.jackson.*.Reviewer notes
configrepository'sbump-jacksonbranch (the submodule is pinned at its tip).buildSrckeeps its own Jackson at 2.18.3 deliberately:buildSrcsources still use the 2.x API; the decoupling comment comes fromconfig../gradlew build dokkaGenerategreen;spine-code-review,kotlin-engineer, andreview-docsall returned APPROVE. Three cosmetic nits were reported and deliberately left for review: a double "other" in oneJacksonSupportKDoc sentence, a repeated[Format]link in the class doc, and the unnamed origin of the@AutoServiceannotation in an example.🤖 Generated with Claude Code