Files
lancedb/java
Will JonesandClaude Opus 5.5 1806dc2323 ci(java): publish beta releases to Fury instead of Maven Central (#5011)
## Summary

Java publishing has failed since `v0.42.0-beta.10` because the `lancedb`
Sonatype org hit Maven Central's monthly release-count limit:

```text
Publishing blocked: your organization has reached its monthly release count limit. Grace period ended 2026-11-08. Usage resets 2026-12-01.
```

This sends beta tags to `https://maven.fury.io/lancedb/` instead,
matching how Python publishes betas to `pypi.fury.io/lancedb`. Stable
releases still go to Maven Central.

```text
tag contains "beta" -> setup-java server "fury"  -> mvn deploy -P deploy-to-fury
otherwise           -> setup-java server "ossrh" -> mvn deploy -P deploy-to-ossrh
```

- `java/pom.xml`: new `deploy-to-fury` profile that points
`distributionManagement` at Fury.
- `java/README.md`: explains how to add the Fury and `maven.lance.org`
repositories to use a beta.

Requires a `FURY_TOKEN` secret with push access to the `lancedb` Fury
account. The token is passed as the Maven username with a placeholder
password. That follows Gemfury's convention but hasn't been tested
against Fury yet.

## Evidence

Running the beta path locally (`deploy -pl lancedb-core -am -P
deploy-to-fury`) against a file repository deployed `lancedb-parent`
(POM) and `lancedb-core` (JAR, POM, sources, javadoc).
`help:effective-pom -P deploy-to-fury` resolves the release repository
to `https://maven.fury.io/lancedb/`.

## Merge Risk

**Door:** Two-way. This only changes where future betas are published;
reverting the workflow restores Central publishing.
**Blast Radius:** `release-ci`. Beta consumers need the extra
repository; stable consumers are unaffected.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 11:34:14 -08:00
..

LanceDB Java Enterprise Client

Installation

Stable releases of com.lancedb:lancedb-core are published to Maven Central.

Beta releases are published to https://maven.fury.io/lancedb/ instead. They depend on Lance beta releases, which are published to https://maven.lance.org. To use a beta, add both repositories alongside Maven Central:

<repositories>
    <repository>
        <id>lancedb</id>
        <url>https://maven.fury.io/lancedb/</url>
    </repository>
    <repository>
        <id>lance</id>
        <url>https://maven.lance.org</url>
    </repository>
</repositories>

For Gradle:

repositories {
    mavenCentral()
    maven { url = uri("https://maven.fury.io/lancedb/") }
    maven { url = uri("https://maven.lance.org") }
}

Use an explicit version, including the full -beta.N suffix. Beta versions are Maven releases, not SNAPSHOT versions.

Configuration and Initialization

LanceDB Cloud (legacy)

For LanceDB Cloud, the legacy hosted service, use the simplified builder API:

import com.lancedb.LanceDbNamespaceClientBuilder;
import org.lance.namespace.LanceNamespace;

// If your DB url is db://example-db, then your database here is example-db
LanceNamespace namespaceClient = LanceDbNamespaceClientBuilder.newBuilder()
    .apiKey("your_lancedb_cloud_api_key")
    .database("your_database_name")
    .build();

LanceDB Enterprise

For LanceDB Enterprise deployments, use your custom endpoint:

LanceNamespace namespaceClient = LanceDbNamespaceClientBuilder.newBuilder()
    .apiKey("your_lancedb_enterprise_api_key")
    .database("your_database_name")
    .endpoint("<your_enterprise_endpoint>")
    .build();

RTE write path

Most table operations reach LanceDB through the LanceNamespace above, which is generated from the Lance Namespace specification. The RTE LSM routes are not part of that specification, so they are issued through a separate client:

import com.lancedb.LanceDbRestClient;
import com.lancedb.LanceDbTableRTE;
import com.lancedb.RTEWriteSpec;

LanceDbRestClient client = LanceDbNamespaceClientBuilder.newBuilder()
    .apiKey("your_lancedb_cloud_api_key")
    .database("your_database_name")
    .buildRestClient();

LanceDbTableRTE rte = new LanceDbTableRTE(client, "my_table");

// Route future merge_insert upserts through the RTE, hash-bucketed by `id`.
rte.enableRTE(RTEWriteSpec.bucket("id", 16));

// ... merge_insert traffic ...

// Converge the fresh tier into the base table.
rte.checkpointRTE();

// Inspect live per-table-shard state.
rte.getRTEStats().ifPresent(stats -> stats.tableShards().forEach(tableShard ->
    System.out.println(tableShard.shardId() + ": " + tableShard.sstables().size() + " SSTables")));

client.close();

maintainedIndexes is tri-state, and the null default is the opposite of what a Java reader usually expects:

Value Meaning
unset (null) Maintain every index the table has, including ones created later
Collections.emptyList() Maintain none
Arrays.asList("id_idx") Maintain exactly those

Development

The parent POM includes https://maven.lance.org to resolve Lance beta and RC dependencies. Use an explicit lance-core.version; numbered beta and RC versions are Maven releases, not snapshots. Maven Central remains available for stable and historical versions, as well as other dependencies.

Build:

./mvnw install -pl lancedb-core -am

Run tests:

./mvnw test -pl lancedb-core