jimble

版と互換性#

いまは 1.0 です#

公開 API を壊す前に、非推奨期間を1マイナー以上置きます。 Semantic Versioning のとおりに扱います。

0.x(〜0.6) 1.0 以降(いま)
公開 API を壊す マイナーで起きうる 非推奨期間を1マイナー以上置いてから、次のメジャーで消す
内部実装を変える いつでも いつでも
CHANGELOG に書く 必ず書く 必ず書く

補足

黙って壊すことはしません。 壊れうる変更は必ず CHANGELOG の **「上げる前に見るところ」と「変わったこと(挙動)」**に出します。 上げる前にそこだけ読めば足ります。

落とし穴

約束が始まるということは、直せなくなるものがあるということです。 戻り値の型、record のコンポーネント、public フィールド、interface の abstract、final—— どれも非推奨期間で救えません(同名で代替を置けないので、 「古いほうを残して新しいほうを足す」ができません)。 1.0 の前に、公開 103 パッケージ・署名 4,514 行を通読して片付けてあります (docs/design-1.0.md)。

どこまでが公開 API か#

パッケージで線を引いています。

公開 API アプリを書くときに触るもの。io.jimble.db、io.jimble.web.server、io.jimble.util.data など
内部実装 入口クラスの内側でしかないもの。io.jimble.db.internal.sql.query.*(SQL の内側)、io.jimble.util.internal.json.encoder(Dson の内側)など
preview 外部の仕様に追随するので、下の約束の対象外。いまは io.jimble.mcp.* だけです

全部の一覧は docs/api-packages.txt にあります。

内部は名前で分かります。

io.jimble.<モジュール>.internal から下は、全部内部実装です。

import に internal が出てきたら、それは触ってはいけないものです。

落とし穴

public だから公開 API、ではありません。 Java には「モジュールの外から見えるが、使ってほしくはない」を表す修飾子がないので、 内部実装も public になっています。internal という名前と、上の一覧が線です。

補足

設定ファイルに書く名前と、コマンドで打つ名前は公開 API です。 logback.xml に書く io.jimble.util.log.encoder.LogbackJsonEncoder や、 Gradle を使わない CI で打つ io.jimble.db.cli.JimbleDbCli は、 import されなくても壊せば止まります。だから internal には入れていません。

**この一覧は古くなりません。**パッケージを増やして一覧に書き忘れると、 ApiSurfaceTest が落ちます。サンプル(examples/)が内部パッケージを import していないかも、同じテストが見ています。

preview——約束の外に置いてあるもの#

io.jimble.mcp.* は 1.0 になっても「壊す前に非推奨期間を1マイナー置く」の対象外です。

MCP は2年で5版が出ており、毎回破壊的な変更が入っています (2026-07-28 では、セッションと GET ストリームが消えました)。 jimble は対応する版を明記して1つだけ実装するという方針なので、 仕様が変わるたびに 「公開 API を壊す」か「仕様に追随しない」かの二択になります。 約束の中に入れると、追随できなくなります。

対応している版は McpProtocol.version() で読めます。 定数ではなくメソッドなのは、public static final String が アプリのバイトコードへそのまま焼き付くからです—— 定数のままだと、jimble を上げてもアプリは古い版の文字列を持ち続け、しかも警告が出ません。

io.jimble.mcp.* を使っているなら、版を上げるときは CHANGELOG を読んでください。 壊れるときは、必ずそこに書きます。

シグネチャは同じなのに、結果が変わるとき#

ここがいちばん大事なところです。

jimble でこれまで実際に起きた壊れ方は、ほとんどがシグネチャを変えない変更でした—— 404 が 405 になる、insertBatch が null を返すようになる、 中断したバッチの履歴が completed から canceled になる。 どれもコンパイルは通るので、上げた側は何も気づきません。

そこで2つに分けて扱います。

何をするか
壊れていたのを直した **すぐ直します。**非推奨期間は置きません
仕様を変えた 1.0 以降は、古い動きを1マイナーのあいだ残します

「壊れていた」に非推奨期間を置かないのは、置けないからです。 たとえば insertBatch は、SQL の揃っていないビルダーを混ぜると 値が横にずれて入っていました。「1マイナーのあいだは、これまでどおり 壊れたデータを書きます」とは言えません。

どちらであっても、CHANGELOG の「変わったこと(挙動)」には必ず出します。 「直した」に埋めて済ませることはしません。

壊すときに何をするか#

  1. 非推奨にする(1.0 以降)。@Deprecated(since = "1.2", forRemoval = true) を付け、 javadoc に代わりに何を使うかを書きます
  2. **CHANGELOG に書く。**いつ消えるかも書きます
  3. **1マイナー以上あけてから消す。**消すのは次のメジャーです

落とし穴

@Deprecated が付いていても、消えるまでは動きます。 ビルドの警告が出るだけです。警告を切らないでください—— 消えたことに気づくのが、上げたあとになります。

2.0 で消したもの・変わったものの一覧は 2.0 への移行 にあります。 ./gradlew jimbleCheck で、書き換える行を出せます(1.5 では --target=2.0 を付けます)。

版を選ぶ#

公開されているものは Maven Central にあります。 依存の座標と、そのまま動くビルドファイルは Gradle プラグイン にあります。

このドキュメントサイトは、いちばん新しいリリースの内容です(版について)。