Skip to content

Commit aa8cbfc

Browse files
xerialclaude
andcommitted
Restructure Jackson modules for 1.0.0: Jackson 3 becomes jackson-dataformat-msgpack
- msgpack-jackson now hosts the Jackson 3.x integration (artifact jackson-dataformat-msgpack, package org.msgpack.jackson3.dataformat, Java 17+) - msgpack-jackson2 hosts the Jackson 2.x integration in maintenance mode (artifact jackson2-dataformat-msgpack, package org.msgpack.jackson.dataformat unchanged, Java 8+) - Distinct packages and artifactIds let both integrations coexist on one classpath for incremental migration - Add sbt-jupiter-interface so the Jackson 2 module's JUnit 5 tests actually run; they had been silently skipped (0 tests detected) on main - Fix MessagePackDataformatTestBase lifecycle annotations (JUnit 4 @Before/ @after on JUnit 5 tests meant setup never ran) - Restore byte-offset-as-columnNr in Jackson 2 MessagePackParser locations, regressed unnoticed in #903 when the deprecated JsonLocation constructor was replaced Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ZZUaHusAjVx6SNu4sA42s
1 parent ac96122 commit aa8cbfc

47 files changed

Lines changed: 109 additions & 95 deletions

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: 5 additions & 3 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-jackson3/**'
31+
- 'msgpack-jackson2/**'
3232
docs:
3333
- '**.md'
3434
- '**.txt'
@@ -83,8 +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
87+
# Java 8 compatible modules only
8688
if [[ ${{ matrix.java }} -lt 17 ]]; then
87-
./sbt msgpack-core/test msgpack-jackson/test
89+
./sbt msgpack-core/test msgpack-jackson2/test
8890
else
8991
./sbt test
9092
fi
@@ -93,7 +95,7 @@ jobs:
9395
TEST_JAVA_HOME: ${{ steps.target-jdk.outputs.path }}
9496
run: |
9597
if [[ ${{ matrix.java }} -lt 17 ]]; then
96-
./sbt msgpack-core/test msgpack-jackson/test -J-Dmsgpack.universal-buffer=true
98+
./sbt msgpack-core/test msgpack-jackson2/test -J-Dmsgpack.universal-buffer=true
9799
else
98100
./sbt test -J-Dmsgpack.universal-buffer=true
99101
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-jackson/publishSigned
42-
# msgpack-jackson3 requires JDK 17+
41+
./sbt msgpack-core/publishSigned msgpack-jackson2/publishSigned
42+
# msgpack-jackson (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-jackson3
47+
- name: Build bundle for msgpack-jackson (Jackson 3)
4848
env:
4949
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
5050
run: |
51-
./sbt msgpack-jackson3/publishSigned
51+
./sbt msgpack-jackson/publishSigned
5252
- name: Release to Sonatype
5353
env:
5454
SONATYPE_USERNAME: '${{ secrets.SONATYPE_USERNAME }}'

CLAUDE.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +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 integration for object mapping capabilities
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+)
1011

1112
## Essential Development Commands
1213

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

5051
Key locations:
5152
- Core interfaces: `msgpack-core/src/main/java/org/msgpack/core/`
52-
- Jackson integration: `msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/`
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/`
5355

5456
### Buffer Management System
5557
MessagePack uses an efficient buffer abstraction layer:
@@ -68,8 +70,8 @@ The msgpack-jackson module provides:
6870
### Testing Structure
6971
- **msgpack-core tests**: Written in Scala (always use the latest Scala 3 version) using AirSpec framework
7072
- Location: `msgpack-core/src/test/scala/`
71-
- **msgpack-jackson tests**: Written in Java using JUnit
72-
- Location: `msgpack-jackson/src/test/java/`
73+
- **msgpack-jackson / msgpack-jackson2 tests**: Written in Java using JUnit
74+
- Location: `msgpack-jackson/src/test/java/`, `msgpack-jackson2/src/test/java/`
7375

7476
## Important JVM Options
7577

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ Two artifacts are published depending on which Jackson major version your projec
5959

6060
| Jackson version | Artifact | Requirements |
6161
| --- | --- | --- |
62-
| Jackson 2.x | [`jackson-dataformat-msgpack`](https://github.com/msgpack/msgpack-java/blob/develop/msgpack-jackson/README.md) | Java 8+ |
63-
| Jackson 3.x | [`jackson-dataformat-msgpack-jackson3`](https://github.com/msgpack/msgpack-java/blob/develop/msgpack-jackson3/README.md) | Java 17+ |
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+ |
6464

65-
Use `jackson-dataformat-msgpack` if your project still depends on Jackson 2.x, or `jackson-dataformat-msgpack-jackson3` if you've upgraded to Jackson 3.x. See each module's README for install instructions and usage details.
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.
6666

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

@@ -153,5 +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 # Contains jackson-dataformat-java implementation
156+
msgpack-jackson # jackson-dataformat-msgpack: Jackson 3.x integration (Java 17+)
157+
msgpack-jackson2 # jackson2-dataformat-msgpack: Jackson 2.x integration (maintenance mode)
157158
```

build.sbt

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ val junitInterface = "com.github.sbt" % "junit-interface" % "0.13.3" % "
123123
val isJava17Plus: Boolean = {
124124
val v = sys.props.getOrElse("java.specification.version", "1.8")
125125
// getOrElse(false): non-numeric versions (e.g. early-access "17-ea") fail safe
126-
// by not compiling the jackson3 module rather than making an optimistic guess.
126+
// by not compiling the Jackson 3 module (msgpack-jackson) rather than making an
127+
// optimistic guess.
127128
if (v.startsWith("1.")) false else scala.util.Try(v.toInt >= 17).getOrElse(false)
128129
}
129130

@@ -136,8 +137,8 @@ lazy val root = Project(id = "msgpack-java", base = file("."))
136137
publishLocal := {}
137138
)
138139
.aggregate(
139-
Seq[ProjectReference](msgpackCore, msgpackJackson) ++
140-
(if (isJava17Plus) Seq[ProjectReference](msgpackJackson3) else Nil): _*
140+
Seq[ProjectReference](msgpackCore, msgpackJackson2) ++
141+
(if (isJava17Plus) Seq[ProjectReference](msgpackJackson) else Nil): _*
141142
)
142143

143144
lazy val msgpackCore = Project(id = "msgpack-core", base = file("msgpack-core"))
@@ -181,33 +182,36 @@ lazy val msgpackCore = Project(id = "msgpack-core", base = file("msgpack-core"))
181182
)
182183
)
183184

184-
lazy val msgpackJackson = Project(id = "msgpack-jackson", base = file("msgpack-jackson"))
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"))
185188
.enablePlugins(SbtOsgi)
186189
.settings(
187190
buildSettings,
188-
name := "jackson-dataformat-msgpack",
189-
description := "Jackson extension that adds support for MessagePack",
190-
OsgiKeys.bundleSymbolicName := "org.msgpack.msgpack-jackson",
191+
name := "jackson2-dataformat-msgpack",
192+
description := "Jackson 2.x extension that adds support for MessagePack",
193+
OsgiKeys.bundleSymbolicName := "org.msgpack.msgpack-jackson2",
191194
OsgiKeys.exportPackage := Seq("org.msgpack.jackson", "org.msgpack.jackson.dataformat"),
192195
libraryDependencies ++=
193196
Seq(
194197
"com.fasterxml.jackson.core" % "jackson-databind" % "2.22.1",
195198
junitJupiter,
196199
junitVintage,
200+
"com.github.sbt.junit" % "jupiter-interface" % JupiterKeys.jupiterVersion.value % "test",
197201
"org.apache.commons" % "commons-math3" % "3.6.1" % "test"
198202
),
199203
testOptions += Tests.Argument(TestFrameworks.JUnit, "-v")
200204
)
201205
.dependsOn(msgpackCore)
202206

203-
lazy val msgpackJackson3 = Project(id = "msgpack-jackson3", base = file("msgpack-jackson3"))
207+
lazy val msgpackJackson = Project(id = "msgpack-jackson", base = file("msgpack-jackson"))
204208
.enablePlugins(SbtOsgi, JmhPlugin)
205209
.settings(
206210
buildSettings,
207-
name := "jackson-dataformat-msgpack-jackson3",
211+
name := "jackson-dataformat-msgpack",
208212
description := "Jackson 3.x extension that adds support for MessagePack",
209-
OsgiKeys.bundleSymbolicName := "org.msgpack.msgpack-jackson3",
210-
OsgiKeys.exportPackage := Seq("org.msgpack.jackson", "org.msgpack.jackson.dataformat"),
213+
OsgiKeys.bundleSymbolicName := "org.msgpack.msgpack-jackson",
214+
OsgiKeys.exportPackage := Seq("org.msgpack.jackson3", "org.msgpack.jackson3.dataformat"),
211215
OsgiKeys.importPackage := Seq("!android.os", "!sun.*"),
212216
Test / fork := true,
213217
javacOptions := Seq("--release", "17"),

msgpack-jackson/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
# jackson-dataformat-msgpack-jackson3
1+
# jackson-dataformat-msgpack
22

33
This Jackson 3.x extension library is a component to easily read and write [MessagePack](http://msgpack.org/) encoded data through jackson-databind API.
44

55
It extends standard Jackson streaming API (`JsonFactory`, `JsonParser`, `JsonGenerator`), and as such works seamlessly with all the higher level data abstractions (data binding, tree model, and pluggable extensions).
66

7-
**Requirements:** Java 17+ and Jackson 3.x. For the Jackson 2.x compatible version, see [`msgpack-jackson`](../msgpack-jackson/).
7+
**Requirements:** Java 17+ and Jackson 3.x. This artifact supports Jackson 3.x since version 1.0.0 (version 0.9.x supported Jackson 2.x). For the Jackson 2.x compatible version, see [`jackson2-dataformat-msgpack`](../msgpack-jackson2/).
88

9-
**Note on imports:** Jackson 3 moved its core and databind packages from `com.fasterxml.jackson` to `tools.jackson`. User-facing annotations (`@JsonProperty`, `@JsonFormat`, etc.) remain in `com.fasterxml.jackson.annotation` for backward compatibility.
9+
**Note on imports:** Jackson 3 moved its core and databind packages from `com.fasterxml.jackson` to `tools.jackson`. User-facing annotations (`@JsonProperty`, `@JsonFormat`, etc.) remain in `com.fasterxml.jackson.annotation` for backward compatibility. Similarly, this library uses the `org.msgpack.jackson3.dataformat` package, while the Jackson 2.x artifact keeps `org.msgpack.jackson.dataformat` — so both artifacts can coexist on the same classpath during an incremental migration.
1010

1111
## Install
1212

@@ -15,15 +15,15 @@ It extends standard Jackson streaming API (`JsonFactory`, `JsonParser`, `JsonGen
1515
```xml
1616
<dependency>
1717
<groupId>org.msgpack</groupId>
18-
<artifactId>jackson-dataformat-msgpack-jackson3</artifactId>
18+
<artifactId>jackson-dataformat-msgpack</artifactId>
1919
<version>(version)</version>
2020
</dependency>
2121
```
2222

2323
### Sbt
2424

2525
```scala
26-
libraryDependencies += "org.msgpack" % "jackson-dataformat-msgpack-jackson3" % "(version)"
26+
libraryDependencies += "org.msgpack" % "jackson-dataformat-msgpack" % "(version)"
2727
```
2828

2929
### Gradle
@@ -34,7 +34,7 @@ repositories {
3434
}
3535
3636
dependencies {
37-
implementation 'org.msgpack:jackson-dataformat-msgpack-jackson3:(version)'
37+
implementation 'org.msgpack:jackson-dataformat-msgpack:(version)'
3838
}
3939
```
4040

@@ -219,7 +219,7 @@ System.out.println(deserialized); // => {42=Hello}
219219

220220
### Serialize and deserialize BigDecimal as str type internally in MessagePack format
221221

222-
`jackson-dataformat-msgpack-jackson3` represents BigDecimal values as float type in MessagePack format by default for backward compatibility. But the default behavior could fail when handling too large value for `double` type. So we strongly recommend calling `MessagePackMapper.Builder#handleBigIntegerAndBigDecimalAsString()` to internally handle BigDecimal values as String.
222+
`jackson-dataformat-msgpack` represents BigDecimal values as float type in MessagePack format by default for backward compatibility. But the default behavior could fail when handling too large value for `double` type. So we strongly recommend calling `MessagePackMapper.Builder#handleBigIntegerAndBigDecimalAsString()` to internally handle BigDecimal values as String.
223223

224224
```java
225225
ObjectMapper objectMapper = MessagePackMapper.builder().handleBigIntegerAndBigDecimalAsString().build();

msgpack-jackson/src/jmh/java/org/msgpack/jackson/dataformat/benchmark/BenchmarkState.java renamed to msgpack-jackson/src/jmh/java/org/msgpack/jackson3/dataformat/benchmark/BenchmarkState.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
// See the License for the specific language governing permissions and
1414
// limitations under the License.
1515
//
16-
package org.msgpack.jackson.dataformat.benchmark;
16+
package org.msgpack.jackson3.dataformat.benchmark;
1717

18-
import org.msgpack.jackson.dataformat.MessagePackFactory;
19-
import org.msgpack.jackson.dataformat.MessagePackMapper;
20-
import org.msgpack.jackson.dataformat.benchmark.model.MediaItem;
21-
import org.msgpack.jackson.dataformat.benchmark.model.MediaItems;
18+
import org.msgpack.jackson3.dataformat.MessagePackFactory;
19+
import org.msgpack.jackson3.dataformat.MessagePackMapper;
20+
import org.msgpack.jackson3.dataformat.benchmark.model.MediaItem;
21+
import org.msgpack.jackson3.dataformat.benchmark.model.MediaItems;
2222
import org.openjdk.jmh.annotations.Scope;
2323
import org.openjdk.jmh.annotations.State;
2424
import tools.jackson.databind.ObjectMapper;

msgpack-jackson/src/jmh/java/org/msgpack/jackson/dataformat/benchmark/MsgpackReadBenchmark.java renamed to msgpack-jackson/src/jmh/java/org/msgpack/jackson3/dataformat/benchmark/MsgpackReadBenchmark.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
// See the License for the specific language governing permissions and
1414
// limitations under the License.
1515
//
16-
package org.msgpack.jackson.dataformat.benchmark;
16+
package org.msgpack.jackson3.dataformat.benchmark;
1717

18-
import org.msgpack.jackson.dataformat.benchmark.model.MediaItem;
18+
import org.msgpack.jackson3.dataformat.benchmark.model.MediaItem;
1919
import org.openjdk.jmh.annotations.Benchmark;
2020
import org.openjdk.jmh.annotations.BenchmarkMode;
2121
import org.openjdk.jmh.annotations.Fork;

msgpack-jackson/src/jmh/java/org/msgpack/jackson/dataformat/benchmark/MsgpackWriteBenchmark.java renamed to msgpack-jackson/src/jmh/java/org/msgpack/jackson3/dataformat/benchmark/MsgpackWriteBenchmark.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
// See the License for the specific language governing permissions and
1414
// limitations under the License.
1515
//
16-
package org.msgpack.jackson.dataformat.benchmark;
16+
package org.msgpack.jackson3.dataformat.benchmark;
1717

18-
import org.msgpack.jackson.dataformat.benchmark.model.MediaItem;
19-
import org.msgpack.jackson.dataformat.benchmark.model.MediaItems;
18+
import org.msgpack.jackson3.dataformat.benchmark.model.MediaItem;
19+
import org.msgpack.jackson3.dataformat.benchmark.model.MediaItems;
2020
import org.openjdk.jmh.annotations.Benchmark;
2121
import org.openjdk.jmh.annotations.BenchmarkMode;
2222
import org.openjdk.jmh.annotations.Fork;

msgpack-jackson/src/jmh/java/org/msgpack/jackson/dataformat/benchmark/NopOutputStream.java renamed to msgpack-jackson/src/jmh/java/org/msgpack/jackson3/dataformat/benchmark/NopOutputStream.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// See the License for the specific language governing permissions and
1414
// limitations under the License.
1515
//
16-
package org.msgpack.jackson.dataformat.benchmark;
16+
package org.msgpack.jackson3.dataformat.benchmark;
1717

1818
import java.io.OutputStream;
1919

0 commit comments

Comments
 (0)