Skip to content

Commit 98e90f5

Browse files
xerialclaude
andcommitted
Publish Jackson 3 module under new groupId org.msgpack.jackson3
Restructure the module layout per PR review feedback (JLBP-6): instead of renaming the Jackson 2 artifact to jackson2-dataformat-msgpack and giving Jackson 3 the unqualified jackson-dataformat-msgpack artifactId, rename the Maven coordinates and the Java package together: - Jackson 2 (msgpack-jackson): keeps org.msgpack:jackson-dataformat-msgpack and the org.msgpack.jackson.dataformat package, exactly as 0.9.x. Existing users need no changes. Maintenance mode: Jackson 2.x bumps and bug fixes only. - Jackson 3 (msgpack-jackson3): published as org.msgpack.jackson3:jackson-dataformat-msgpack with the org.msgpack.jackson3.dataformat package, mirroring Jackson's own 2->3 groupId rename (com.fasterxml.jackson.dataformat -> tools.jackson.dataformat). Because the two artifacts share the same fully-qualified class names in neither direction, they can coexist on one classpath, and dependency resolution can never silently replace the Jackson 2 classes with Jackson 3 ones (or vice versa). The 1.0.0 version bump is no longer needed. Both sbt subprojects now share the module name jackson-dataformat-msgpack, so the Jackson 3 project overrides outputPath to keep sbt 2 build output directories from overlapping. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C4Sp7Q2urgnYfuNXK2fVFm
1 parent 3b3ea6a commit 98e90f5

72 files changed

Lines changed: 850 additions & 836 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/CI.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ jobs:
2828
- 'project/build.properties'
2929
- 'msgpack-core/**'
3030
- 'msgpack-jackson/**'
31-
- 'msgpack-jackson2/**'
31+
- 'msgpack-jackson3/**'
3232
docs:
3333
- '**.md'
3434
- '**.txt'
@@ -83,10 +83,10 @@ jobs:
8383
env:
8484
TEST_JAVA_HOME: ${{ steps.target-jdk.outputs.path }}
8585
run: |
86-
# msgpack-jackson (Jackson 3) requires JDK 17+; older lanes test the
86+
# msgpack-jackson3 (Jackson 3) requires JDK 17+; older lanes test the
8787
# Java 8 compatible modules only
8888
if [[ ${{ matrix.java }} -lt 17 ]]; then
89-
./sbt msgpack-core/test msgpack-jackson2/test
89+
./sbt msgpack-core/test msgpack-jackson/test
9090
else
9191
./sbt test
9292
fi
@@ -95,7 +95,7 @@ jobs:
9595
TEST_JAVA_HOME: ${{ steps.target-jdk.outputs.path }}
9696
run: |
9797
if [[ ${{ matrix.java }} -lt 17 ]]; then
98-
./sbt msgpack-core/test msgpack-jackson2/test -J-Dmsgpack.universal-buffer=true
98+
./sbt msgpack-core/test msgpack-jackson/test -J-Dmsgpack.universal-buffer=true
9999
else
100100
./sbt test -J-Dmsgpack.universal-buffer=true
101101
fi

.github/workflows/release.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,17 @@ jobs:
3838
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
3939
TEST_JAVA_HOME: ${{ steps.jdk8.outputs.path }}
4040
run: |
41-
./sbt msgpack-core/publishSigned msgpack-jackson2/publishSigned
42-
# msgpack-jackson (Jackson 3) requires JDK 17+
41+
./sbt msgpack-core/publishSigned msgpack-jackson/publishSigned
42+
# msgpack-jackson3 (Jackson 3) requires JDK 17+
4343
- uses: actions/setup-java@v5
4444
with:
4545
java-version: 17
4646
distribution: temurin
47-
- name: Build bundle for msgpack-jackson (Jackson 3)
47+
- name: Build bundle for msgpack-jackson3 (Jackson 3)
4848
env:
4949
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
5050
run: |
51-
./sbt msgpack-jackson/publishSigned
51+
./sbt msgpack-jackson3/publishSigned
5252
- name: Release to Sonatype
5353
env:
5454
SONATYPE_USERNAME: '${{ secrets.SONATYPE_USERNAME }}'

CLAUDE.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
66

77
MessagePack-Java is a binary serialization library that provides a fast and compact alternative to JSON. The project consists of two main modules:
88
- **msgpack-core**: Standalone MessagePack implementation with no external dependencies
9-
- **msgpack-jackson**: Jackson 3.x integration for object mapping capabilities (artifact `jackson-dataformat-msgpack`, Java 17+)
10-
- **msgpack-jackson2**: Jackson 2.x integration in maintenance mode (artifact `jackson2-dataformat-msgpack`, Java 8+)
9+
- **msgpack-jackson**: Jackson 2.x integration in maintenance mode (`org.msgpack:jackson-dataformat-msgpack`, Java 8+)
10+
- **msgpack-jackson3**: Jackson 3.x integration for object mapping capabilities (`org.msgpack.jackson3:jackson-dataformat-msgpack`, Java 17+)
1111

1212
## Essential Development Commands
1313

@@ -50,8 +50,8 @@ The main entry point is the `MessagePack` factory class which creates:
5050

5151
Key locations:
5252
- Core interfaces: `msgpack-core/src/main/java/org/msgpack/core/`
53-
- Jackson 3 integration: `msgpack-jackson/src/main/java/org/msgpack/jackson3/dataformat/`
54-
- Jackson 2 integration: `msgpack-jackson2/src/main/java/org/msgpack/jackson/dataformat/`
53+
- Jackson 2 integration: `msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/`
54+
- Jackson 3 integration: `msgpack-jackson3/src/main/java/org/msgpack/jackson3/dataformat/`
5555

5656
### Buffer Management System
5757
MessagePack uses an efficient buffer abstraction layer:
@@ -70,8 +70,8 @@ The msgpack-jackson module provides:
7070
### Testing Structure
7171
- **msgpack-core tests**: Written in Scala (always use the latest Scala 3 version) using AirSpec framework
7272
- Location: `msgpack-core/src/test/scala/`
73-
- **msgpack-jackson / msgpack-jackson2 tests**: Written in Java using JUnit
74-
- Location: `msgpack-jackson/src/test/java/`, `msgpack-jackson2/src/test/java/`
73+
- **msgpack-jackson / msgpack-jackson3 tests**: Written in Java using JUnit
74+
- Location: `msgpack-jackson/src/test/java/`, `msgpack-jackson3/src/test/java/`
7575

7676
## Important JVM Options
7777

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ msgpack-java supports serialization and deserialization of Java objects through
5757

5858
Two artifacts are published depending on which Jackson major version your project uses:
5959

60-
| Jackson version | Artifact | Requirements |
61-
| --- | --- | --- |
62-
| Jackson 3.x | [`jackson-dataformat-msgpack`](https://github.com/msgpack/msgpack-java/blob/main/msgpack-jackson/README.md) (1.x) | Java 17+ |
63-
| Jackson 2.x | [`jackson2-dataformat-msgpack`](https://github.com/msgpack/msgpack-java/blob/main/msgpack-jackson2/README.md) (maintenance mode) | Java 8+ |
60+
| Jackson version | groupId | artifactId | Java package | Requirements |
61+
| --- | --- | --- | --- | --- |
62+
| Jackson 3.x | `org.msgpack.jackson3` | [`jackson-dataformat-msgpack`](https://github.com/msgpack/msgpack-java/blob/main/msgpack-jackson3/README.md) | `org.msgpack.jackson3.dataformat` | Java 17+ |
63+
| Jackson 2.x | `org.msgpack` | [`jackson-dataformat-msgpack`](https://github.com/msgpack/msgpack-java/blob/main/msgpack-jackson/README.md) (maintenance mode) | `org.msgpack.jackson.dataformat` | Java 8+ |
6464

65-
Since msgpack-java 1.0.0, `jackson-dataformat-msgpack` targets Jackson 3.x. If your project still depends on Jackson 2.x, either stay on `jackson-dataformat-msgpack` 0.9.x or switch to `jackson2-dataformat-msgpack` to keep receiving msgpack-core updates (only the artifactId changes; the Java package is the same). See each module's README for install instructions and usage details.
65+
The Jackson 2.x artifact keeps the same Maven coordinates and Java package as before, so existing users need no changes. The Jackson 3.x support is published under a new groupId (`org.msgpack.jackson3`) with a new Java package, following the same convention as Jackson itself (`com.fasterxml.jackson.dataformat``tools.jackson.dataformat`); renaming the Maven coordinates and the Java package together allows both artifacts to coexist on the same classpath for incremental migration. See each module's README for install instructions and usage details.
6666

6767
- [Release Notes](https://github.com/msgpack/msgpack-java/blob/develop/RELEASE_NOTES.md)
6868

@@ -153,6 +153,6 @@ If some sporadic error happens (e.g., Sonatype timeout), rerun `sonaRelease` aga
153153

154154
```
155155
msgpack-core # Contains packer/unpacker implementation that never uses third-party libraries
156-
msgpack-jackson # jackson-dataformat-msgpack: Jackson 3.x integration (Java 17+)
157-
msgpack-jackson2 # jackson2-dataformat-msgpack: Jackson 2.x integration (maintenance mode)
156+
msgpack-jackson # org.msgpack:jackson-dataformat-msgpack: Jackson 2.x integration (maintenance mode)
157+
msgpack-jackson3 # org.msgpack.jackson3:jackson-dataformat-msgpack: Jackson 3.x integration (Java 17+)
158158
```

build.sbt

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,10 @@ val isJava17Plus: Boolean = {
125125
// getOrElse(false): non-numeric versions (e.g. early-access "17-ea") fail safe
126126
// by not compiling the Jackson 3 module (msgpack-jackson) rather than making an
127127
// optimistic guess.
128-
if (v.startsWith("1.")) false else scala.util.Try(v.toInt >= 17).getOrElse(false)
128+
if (v.startsWith("1."))
129+
false
130+
else
131+
scala.util.Try(v.toInt >= 17).getOrElse(false)
129132
}
130133

131134
lazy val root = Project(id = "msgpack-java", base = file("."))
@@ -137,8 +140,12 @@ lazy val root = Project(id = "msgpack-java", base = file("."))
137140
publishLocal := {}
138141
)
139142
.aggregate(
140-
Seq[ProjectReference](msgpackCore, msgpackJackson2) ++
141-
(if (isJava17Plus) Seq[ProjectReference](msgpackJackson) else Nil): _*
143+
Seq[ProjectReference](msgpackCore, msgpackJackson) ++ (
144+
if (isJava17Plus)
145+
Seq[ProjectReference](msgpackJackson3)
146+
else
147+
Nil
148+
): _*
142149
)
143150

144151
lazy val msgpackCore = Project(id = "msgpack-core", base = file("msgpack-core"))
@@ -182,49 +189,56 @@ lazy val msgpackCore = Project(id = "msgpack-core", base = file("msgpack-core"))
182189
)
183190
)
184191

185-
// Maintenance-mode module for Jackson 2.x users: Jackson 2.x dependency bumps and
186-
// bug fixes only. To be dropped in a future major release when Jackson 2 usage fades.
187-
lazy val msgpackJackson2 = Project(id = "msgpack-jackson2", base = file("msgpack-jackson2"))
192+
// Jackson 2.x module. Keeps the same Maven coordinates (org.msgpack:jackson-dataformat-msgpack)
193+
// and Java package as the 0.9.x line, so existing Jackson 2.x users need no changes.
194+
// Maintenance mode: Jackson 2.x dependency bumps and bug fixes only.
195+
lazy val msgpackJackson = Project(id = "msgpack-jackson", base = file("msgpack-jackson"))
188196
.enablePlugins(SbtOsgi)
189197
.settings(
190198
buildSettings,
191-
name := "jackson2-dataformat-msgpack",
199+
name := "jackson-dataformat-msgpack",
192200
description := "Jackson 2.x extension that adds support for MessagePack",
193-
OsgiKeys.bundleSymbolicName := "org.msgpack.msgpack-jackson2",
201+
OsgiKeys.bundleSymbolicName := "org.msgpack.msgpack-jackson",
194202
OsgiKeys.exportPackage := Seq("org.msgpack.jackson", "org.msgpack.jackson.dataformat"),
195203
libraryDependencies ++=
196204
Seq(
197205
"com.fasterxml.jackson.core" % "jackson-databind" % "2.22.1",
198206
junitJupiter,
199207
junitVintage,
200208
"com.github.sbt.junit" % "jupiter-interface" % JupiterKeys.jupiterVersion.value % "test",
201-
"org.apache.commons" % "commons-math3" % "3.6.1" % "test"
209+
"org.apache.commons" % "commons-math3" % "3.6.1" % "test"
202210
),
203211
testOptions += Tests.Argument(TestFrameworks.JUnit, "-v")
204212
)
205213
.dependsOn(msgpackCore)
206214

207-
lazy val msgpackJackson = Project(id = "msgpack-jackson", base = file("msgpack-jackson"))
215+
// Jackson 3.x module. Published under a new groupId (org.msgpack.jackson3) with a new
216+
// Java package (org.msgpack.jackson3.dataformat), following JLBP-6: the Maven coordinates
217+
// and the Java package are renamed together, so this artifact can coexist on the same
218+
// classpath with the Jackson 2.x artifact (org.msgpack:jackson-dataformat-msgpack).
219+
lazy val msgpackJackson3 = Project(id = "msgpack-jackson3", base = file("msgpack-jackson3"))
208220
.enablePlugins(SbtOsgi, JmhPlugin)
209221
.settings(
210222
buildSettings,
211-
name := "jackson-dataformat-msgpack",
223+
organization := "org.msgpack.jackson3",
224+
name := "jackson-dataformat-msgpack",
225+
// sbt derives build output paths from moduleName, which would collide with the
226+
// Jackson 2 module publishing the same artifactId; use the project id instead
227+
outputPath := s"${platform.value}/u/msgpack-jackson3",
212228
description := "Jackson 3.x extension that adds support for MessagePack",
213-
OsgiKeys.bundleSymbolicName := "org.msgpack.msgpack-jackson",
229+
OsgiKeys.bundleSymbolicName := "org.msgpack.jackson3.jackson-dataformat-msgpack",
214230
OsgiKeys.exportPackage := Seq("org.msgpack.jackson3", "org.msgpack.jackson3.dataformat"),
215231
OsgiKeys.importPackage := Seq("!android.os", "!sun.*"),
216-
Test / fork := true,
217-
javacOptions := Seq("--release", "17"),
218-
doc / javacOptions := Seq("--release", "17", "-Xdoclint:none"),
232+
Test / fork := true,
233+
javacOptions := Seq("--release", "17"),
234+
doc / javacOptions := Seq("--release", "17", "-Xdoclint:none"),
219235
libraryDependencies ++=
220-
Seq(
221-
"tools.jackson.core" % "jackson-databind" % "3.1.2",
222-
junitInterface
223-
),
236+
Seq("tools.jackson.core" % "jackson-databind" % "3.1.2", junitInterface),
224237
testOptions += Tests.Argument(TestFrameworks.JUnit, "-v"),
225-
Jmh / javaOptions ++= Seq(
226-
"--add-opens=java.base/java.nio=ALL-UNNAMED",
227-
"--add-opens=java.base/sun.nio.ch=ALL-UNNAMED"
228-
)
238+
Jmh / javaOptions ++=
239+
Seq(
240+
"--add-opens=java.base/java.nio=ALL-UNNAMED",
241+
"--add-opens=java.base/sun.nio.ch=ALL-UNNAMED"
242+
)
229243
)
230244
.dependsOn(msgpackCore)

0 commit comments

Comments
 (0)