Bump local dependencies, migrate to Jackson 3, and align conflicting artifact versions - #85
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The Jackson 3 migration moved the `Jackson` dependency object from the `com.fasterxml.jackson` group to `tools.jackson`. The force directives in `tests/build.gradle.kts` kept referring to `Jackson`, so they now pin the 3.x coordinates and no longer align the 2.x artifacts, which reach this build only transitively: * `palantir-java-format` brings Jackson 2.21.1; * `intellij-platform-java` brings Jackson 2.22.1. Since `forceVersions()` enables `failOnVersionConflict()`, that divergence failed `:compiler-extension:extractIncludeProto` instead of resolving to the higher version. Align the whole 2.x group via `eachDependency` rather than an enumerated force list: the conflict also covers artifacts `JacksonV2` does not model, such as `jackson-jr-objects` and `jackson-module-kotlin`. A BOM cannot be used here because the Protobuf plugin configurations, `compileProtoPath` among them, ignore `enforcedPlatform`. `jackson-annotations` is excluded because Jackson 3.x keeps consuming it at its own version, forced via `Jackson.annotations`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Regenerated after the ToolBase bump to `2.0.0-SNAPSHOT.410`, which widens the IntelliJ Platform transitive surface and brings in the Jackson 2.x artifacts aligned by the preceding commit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The comment cited the concrete versions the two consumers happened to bring at the time. Bumping Palantir Java Format to 2.97.0 aligned them on 2.22.1, which made those numbers wrong. State the condition the rule guards against instead, so the comment stays true across future bumps. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Resolutions:
* `version.gradle.kts` — kept `2.0.0-SNAPSHOT.066`, above master's `.065`.
* `config` — kept `02824c32`, which already contains master's `c93dbeed`.
* `BuildExtensions.kt` — kept this branch's text, which matches the
authoritative copy in `config` at `02824c32`; master carried the older
wording that `config` has since revised.
* `Compiler.kt` — kept the `2.0.0-SNAPSHOT.065` fallback versions, above
master's `.064`.
* `docs/dependencies/` — regenerated by the build in the following commit.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Updates this repository’s build and dependency model to newer Spine snapshots and modernizes third‑party dependencies by migrating to Jackson 3 while explicitly managing remaining Jackson 2.x transitives and resolving cross-module version conflicts.
Changes:
- Bump local Spine dependency snapshots and project version to
2.0.0-SNAPSHOT.066, removing obsolete coordinates (ModelCompiler,Compiler.cliApi) and correcting the Compiler fat CLI artifact coordinate. - Migrate Jackson to
tools.jackson:*(3.x) while keeping a modeled Jackson 2.x line (JacksonV2) to align transitivecom.fasterxml.jackson:*dependencies (notably for integration tests). - Address build/reproducibility and dependency consistency: force
spine-timeconsistently, opt the license report task out of build cache, and regenerate dependency reporting POM.
Reviewed changes
Copilot reviewed 22 out of 24 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| version.gradle.kts | Bumps the compiler/project version to 2.0.0-SNAPSHOT.066. |
| tests/build.gradle.kts | Adds Jackson 2.x alignment for transitive com.fasterxml.jackson:* while keeping Jackson 3 as the declared line. |
| jvm/src/test/kotlin/io/spine/tools/compiler/jvm/style/JavaCodeStyleFormatterPluginSpec.kt | Adds a reason to the disabled test annotation. |
| docs/dependencies/pom.xml | Regenerates dependency report POM reflecting updated versions and Jackson 3 coordinates. |
| buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt | Disables build-cache for license report generation; uses shared path constants via imports. |
| buildSrc/src/main/kotlin/io/spine/dependency/test/Testcontainers.kt | Bumps Testcontainers to 2.x and updates module coordinates to the new prefixed artifact names. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt | Bumps Validation version and removes unused legacy coordinates. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt | Bumps ToolBase (and dogfooding) versions. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt | Bumps Spine Time version. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/ModelCompiler.kt | Removes the obsolete ModelCompiler dependency definition. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt | Bumps Spine Logging version. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt | Bumps Spine Core JVM version. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt | Bumps fallback Compiler versions, removes cliApi, and corrects fat CLI artifact coordinate. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Change.kt | Bumps Spine Change version. |
| buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt | Bumps Spine Base versions (including buildscript version). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/Roaster.kt | Removes outdated Roaster Java-version note (keeping the current version). |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/PalantirJavaFormat.kt | Bumps Palantir Java Format version. |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/Log4j2.kt | Bumps Log4j2 and adds an explicit SLF4J 2.x bridge coordinate. |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/JacksonV2.kt | Introduces modeled Jackson 2.x dependency line for transitive alignment. |
| buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt | Migrates Jackson to 3.x tools.jackson coordinates and documents the annotations exception. |
| buildSrc/src/main/kotlin/io/spine/dependency/boms/Boms.kt | Switches optional Jackson BOM to Jackson 2.x (JacksonV2.bom). |
| buildSrc/src/main/kotlin/BuildExtensions.kt | Adds shared excludeJetBrainsAnnotations() helper for published dependencies. |
| buildSrc/build.gradle.kts | Clarifies why buildSrc stays pinned to Jackson 2.x API/coordinates. |
| build.gradle.kts | Forces spine-time and spine-time-java consistently across all projects. |
| .github/workflows/gradle-wrapper-validation.yml | Removes the Gradle wrapper validation workflow. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #85 +/- ##
=========================================
Coverage 76.89% 76.89%
Complexity 688 688
=========================================
Files 205 205
Lines 4025 4025
Branches 402 402
=========================================
Hits 3095 3095
Misses 800 800
Partials 130 130 🚀 New features to boost your workflow:
|
armiol
approved these changes
Aug 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
Local (Spine) dependency bumps
ToolBase(incl.dogfoodingVersion)2.0.0-SNAPSHOT.4042.0.0-SNAPSHOT.410Base(incl.versionForBuildScript)2.0.0-SNAPSHOT.4262.0.0-SNAPSHOT.440CoreJvm2.0.0-SNAPSHOT.5222.0.0-SNAPSHOT.523Time2.0.0-SNAPSHOT.2442.0.0-SNAPSHOT.250Validation2.0.0-SNAPSHOT.4502.0.0-SNAPSHOT.460Logging2.0.0-SNAPSHOT.4222.0.0-SNAPSHOT.423Change2.0.0-SNAPSHOT.2062.0.0-SNAPSHOT.207ModelCompileris removed — superseded by the Spine Compiler and no longerreferenced.
Compiler.fatCliis corrected fromcompiler-fat-clitocompiler-cli-all, which is the artifact actually published by thecliFatJarpublication in
cli/build.gradle.ktsand the coordinateArtifacts.fatCli()already returned — the old constant pointed at something that was never
published.
Third-party dependency bumps
2.22.1(com.fasterxml.jackson)3.2.1(tools.jackson)2.91.02.97.02.26.02.26.11.21.42.0.5Jackson 3 renames the coordinates from
com.fasterxml.jackson.*totools.jackson.*, which is whydocs/dependencies/shows a large diff. A newJacksonV2object retains the 2.x line for artifacts that reach ustransitively, and
buildSrc/build.gradle.ktsstays pinned to Jackson2.18.3because the
buildSrcsources still use the 2.x API.Testcontainers 2.x prefixes its module artifacts (
junit-jupiter→testcontainers-junit-jupiter, and so on) while the core artifact keeps theplain
testcontainersname. Nothing in this repository consumes Testcontainers,so the bump only affects other
configconsumers.Forcing the
spine-timeversion./gradlew clean buildreported a genuine cross-module conflict:spine-timearrives by two routes — transitively at.244(viaspine-core→spine-client→spine-server), and at.250from our ownTimeconstantthrough
spine-time-java. Nothing forced it, so conflict resolution picked adifferent winner per module.
Time.libandTime.javaExtensionsare now in theallprojectsforce list inthe root
build.gradle.kts, matching whattests/build.gradle.ktsalready did.Both are forced together deliberately: pinning
spine-timewithoutspine-time-javawould let the core and its extensions diverge, which is aworse failure than the original.
Aligning the transitive Jackson 2.x line in the integration tests
The Jackson 3 migration moved the
Jacksonobject to thetools.jacksongroup,so the existing
Jackson.forceArtifacts(...)calls intests/build.gradle.ktsbegan pinning the 3.x coordinates and stopped aligning
com.fasterxml.jackson.*— which reaches that build only transitively. Because
forceVersions()enablesfailOnVersionConflict(), the resulting divergence failed:compiler-extension:extractIncludeProtooutright rather than resolving to thehigher version.
An
eachDependencyrule now aligns the wholecom.fasterxml.jacksongroup toJacksonV2.version. A group rule rather than an enumerated force list, becausethe conflict also covered artifacts
JacksonV2does not model(
jackson-jr-objects,jackson-module-kotlin). A BOM cannot serve here: theProtobuf plugin configurations,
compileProtoPathamong them, ignoreenforcedPlatform— asBomsPlugin.supportsBomalready documents.jackson-annotationsis excluded because Jackson 3.x keeps consuming it at itsown version (
2.22), forced separately viaJackson.annotations.The Palantir Java Format bump to
2.97.0then fixed the same divergence at itssource:
2.97.0requests jackson-core/databind at exactly2.22.1andjackson-annotations at
2.22, matchingJacksonV2.versionandJackson.annotationsVersion. The alignment rule is therefore currentlybelt-and-braces rather than load-bearing — it is kept so a future bump on either
side fails soft instead of reproducing the same opaque conflict.
Housekeeping
configsubmodule updated to02824c32(onconfig'smaster)..github/workflows/gradle-wrapper-validation.ymlremoved.@DisabledonJavaCodeStyleFormatterPluginSpecnow carries its reason.2.0.0-SNAPSHOT.066.docs/dependencies/{pom.xml,dependencies.md}regenerated.dependencies.mdgrows substantially because ToolBase
.410widens the IntelliJ Platformtransitive surface; the module-section count is unchanged, so this is added
entries rather than duplication.
Verification
Run locally on JDK 21:
./gradlew build dokkaGenerate— PASS, no version-conflict diagnostics.tests/./gradlew clean build(integration) — PASS, including:compiler-extension:extractIncludeProto, the task that previously failed.docs/dependencies/pom.xmlrecordsspine-timeat2.0.0-SNAPSHOT.250.Reviewers run:
spine-code-review,kotlin-engineer,dependency-audit,review-docs.Notes for the reviewer
master(which merged Updateconfig#84). Both sides carry their ownBump version -> 2.0.0-SNAPSHOT.065commit, soversion.gradle.kts, theconfigpointer, anddocs/dependencies/may need conflict resolution onmerge. This branch is at
.066, abovemaster's.065, so the version gateholds.
dependency-auditfinding, for theconfigrepo rather than this branch:four symbols were removed without the conventional
@Deprecatedtombstone —ModelCompiler,Compiler.cliApi,Validation.model, andValidation.configModule. No caller survives here, but otherconfigconsumers may still reference them. The same diff handles this correctly for
the Jackson symbols, which is the pattern to copy.
config's POM reporter.generatePomresolvessubprojects' configurations from a root task action, which Gradle 9.6 rejects
(
IllegalResolutionException: ... without an exclusive lock). The failure isswallowed and logged at
info, so the report silently falls back todeclared versions and its content depends on which tasks ran before it —
making standalone
./gradlew generatePomemit false "several versions"warnings for artifacts that
force(...)has already reconciled. Written up inthe
configrepo as.agents/tasks/pom-report-cross-project-resolution.md;out of scope here.
🤖 Generated with Claude Code