This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch docs
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/docs by this push:
new 4c43cb0ed2 docs: document JDK HttpClient as the built-in default
transport (TODO-41) and finish TODO-42 docs
4c43cb0ed2 is described below
commit 4c43cb0ed2932286223be656f615ed981ac34d95
Author: James Bognar <[email protected]>
AuthorDate: Tue May 19 10:26:07 2026 -0400
docs: document JDK HttpClient as the built-in default transport (TODO-41)
and finish TODO-42 docs
- 12.15.NextGenRestClient.md, 20.03.JuneauShadedRestClient.md: drop the
juneau-rest-client-java-httpclient row from the transport table and
rework the surrounding prose to call out the JDK HttpClient transport
as built into juneau-rest-client (the default) with the four sibling
transport modules as opt-in overrides via ServiceLoader.
- pages/release-notes/9.5.0.md: refresh the TODO-38 transport table to
delete the JDK row and add a new "JDK HttpClient is now the built-in
default transport (TODO-41)" section with usage examples.
- 09.01.JuneauRestCommonBasics.md: previously-unpushed TODO-42 rewrite
describing the juneau-rest-common / juneau-rest-common-classic split.
- 23.01.V9.5-migration-guide.md: previously-unpushed TODO-42 migration
rows for the rest-common split and the EntityTag/EntityTags moves.
No migration-guide row was added for TODO-41 —
juneau-rest-client-java-httpclient
was never released, so no downstream consumer can have referenced it.
---
pages/release-notes/9.5.0.md | 57 ++++++++++++++++++++++++--
pages/topics/09.01.JuneauRestCommonBasics.md | 61 +++++++++++++++++++++-------
pages/topics/12.15.NextGenRestClient.md | 16 ++++----
pages/topics/20.03.JuneauShadedRestClient.md | 4 +-
pages/topics/23.01.V9.5-migration-guide.md | 31 ++++++++++++++
5 files changed, 143 insertions(+), 26 deletions(-)
diff --git a/pages/release-notes/9.5.0.md b/pages/release-notes/9.5.0.md
index 03ecc69d96..928482f2fb 100644
--- a/pages/release-notes/9.5.0.md
+++ b/pages/release-notes/9.5.0.md
@@ -2117,17 +2117,18 @@ The legacy Apache HttpClient 4.5–based client moved to
`org.apache.juneau.rest
#### Transport Implementations
-Each transport is an independent module pulling in only its native client. The
`HttpTransportProvider` `ServiceLoader` entries let
`RestClient.create().build()` auto-discover the highest-priority transport on
the classpath.
+The JDK `HttpClient`–based `JavaHttpTransport` ships built into the canonical
`juneau-rest-client` artifact and is the default — `RestClient.create()` works
out of the box on Java 11+ with zero third-party dependencies (see TODO-41
below).
+
+To swap in a different native HTTP client, add one of the optional transport
modules. Each registers a higher-priority `HttpTransportProvider` via
`ServiceLoader`, so `RestClient.create().build()` automatically picks it up.
| Module | Artifact ID | Native client |
|---|---|---|
| Apache HttpClient 4.5 | `juneau-rest-client-apache-httpclient-45` |
`org.apache.httpcomponents:httpclient:4.5.x` |
| Apache HttpClient 5 | `juneau-rest-client-apache-httpclient-50` |
`org.apache.httpcomponents.client5:httpclient5` |
-| JDK `HttpClient` | `juneau-rest-client-java-httpclient` |
`java.net.http.HttpClient` (Java 11+) — zero third-party deps |
| OkHttp | `juneau-rest-client-okhttp` | `com.squareup.okhttp3:okhttp` |
| Eclipse Jetty client | `juneau-rest-client-jetty` |
`org.eclipse.jetty:jetty-client` |
-Each transport module ships `*Transport`, `*TransportBuilder` (with native
client–specific configuration accessible via cast), and `*TransportProvider`.
Common transport-builder configuration (`connectTimeout`, `readTimeout`,
`sslContext`, `hostnameVerifier`, `proxy`, `maxConnections`,
`maxConnectionsPerRoute`, `followRedirects`, …) lives on `HttpTransportBuilder`
so most callers don't need to cast.
+Each optional transport module ships `*Transport`, `*TransportBuilder` (with
native client–specific configuration accessible via cast), and
`*TransportProvider`. Common transport-builder configuration (`connectTimeout`,
`readTimeout`, `sslContext`, `hostnameVerifier`, `proxy`, `maxConnections`,
`maxConnectionsPerRoute`, `followRedirects`, …) lives on `HttpTransportBuilder`
so most callers don't need to cast.
#### `juneau-rest-mock` — `org.apache.juneau.rest.mock`
@@ -2149,6 +2150,23 @@ The pre-existing Apache HttpClient 4.5–based REST client
moved into a new sibl
Both modules can be on the classpath simultaneously — they share
`juneau-rest-common` but expose disjoint packages. The aggregator artifacts
(`juneau-shaded-rest-client`, `juneau-shaded-all`, `juneau-microservice`,
`juneau-rest-mock`, `juneau-distrib`) pull in both flavors so existing
assemblies see no behavioral change.
+### `juneau-rest-common` split into `juneau-rest-common` +
`juneau-rest-common-classic` (TODO-42)
+
+Mirroring the `juneau-rest-client` split above, the `juneau-rest-common`
module is now split into a pure transport-neutral module and a new sibling that
owns every Apache HttpClient 4.5–compatible facade.
+
+| Artifact | Contents | Apache HttpClient 4.5 dependency? |
+|---|---|---|
+| `juneau-rest-common` | Transport-neutral types under
`org.apache.juneau.http.*` (annotations, lazy header beans, remote-proxy meta,
parts, entities, `HttpHeaders` factory), plus
`org.apache.juneau.http.remote.*`. | **No.** Zero `org.apache.httpcomponents:*`
on the classpath. |
+| `juneau-rest-common-classic` (new) | Every type formerly at
`org.apache.juneau.http.classic.*` — Apache HttpClient 4.5–style headers,
parts, entities, resources, responses, the classic `HeaderList`, and the
classic `Remote*Meta` proxy bridges. **FQCNs unchanged** — only the Maven
coordinate moved. | **Yes.** Depends on `org.apache.juneau:juneau-rest-common`
and `org.apache.httpcomponents:httpcore:4.4.16`. |
+
+**Why:** `juneau-rest-common` was the last `juneau-rest-*` module forcing
`org.apache.httpcomponents:httpcore` onto every downstream consumer
(transports, microservices, examples, mock). Splitting it lets the canonical NG
stack ship genuinely transport-neutral.
+
+**Backward compatibility:**
+- Fully qualified class names are unchanged —
`org.apache.juneau.http.classic.header.EntityTag` is still
`org.apache.juneau.http.classic.header.EntityTag`. Source-compatible.
+- Code that already depended on `juneau-rest-common` and used a `classic.*`
type now needs an additional `<dependency>` on `juneau-rest-common-classic`.
The aggregator artifacts (`juneau-rest-server`, `juneau-rest-client-classic`,
`juneau-rest-mock`, `juneau-microservice`, `juneau-rest-server-springboot`,
`juneau-shaded-rest-server`, `juneau-shaded-rest-client`, `juneau-shaded-all`,
`juneau-distrib`) already pull both modules in transitively, so most callers
see no Maven change.
+- `EntityTag` / `EntityTags` value types (no HC 4.5 dependency, despite the
historical package) moved out of `classic.header` to
`org.apache.juneau.http.header.EntityTag` / `EntityTags`. **This is a
source-incompatible change** for any caller that imported them explicitly — see
the v9.5 migration guide.
+- `@Remote(headerList = ...)` annotation method changed from `Class<? extends
HeaderList>` to `Class<?>`. Existing user annotations like `@Remote(headerList
= MyHeaderList.class)` continue to work; the classic `RemoteMeta` performs an
`instanceof HeaderList` check at runtime before invoking. The default sentinel
changed from `HeaderList.Void.class` to `java.lang.Void.class`.
+
#### Usage Examples
```java
@@ -2199,6 +2217,39 @@ The classic `RestClient` / `juneau-rest-common` APIs
remain fully supported. Mig
The classic stack is **not** deprecated in 9.5; the canonical stack will
graduate to stable in a future release, at which point the classic stack may be
deprecated and eventually removed.
+### JDK `HttpClient` is now the built-in default transport (TODO-41)
+
+The JDK `java.net.http.HttpClient`–based transport (`JavaHttpTransport`) is
now part of the `juneau-rest-client` artifact itself. The previously separate
`juneau-rest-client-java-httpclient` module — which had no third-party
dependencies and was never released — has been folded in and removed.
+
+**What this means for callers:**
+
+- `RestClient.create()` works out of the box on Java 11+ with **zero**
third-party dependencies. No transport module is required for a baseline HTTP
client.
+- The four remaining sibling transport modules
(`juneau-rest-client-apache-httpclient-45`, `-apache-httpclient-50`, `-okhttp`,
`-jetty`) continue to register higher-priority providers via `ServiceLoader`
and automatically take over discovery when added to the classpath.
+- Explicit `RestClient.builder().transport(...)` always wins over
auto-discovery.
+- `RestClient.discoverTransport()` now falls back to
`JavaHttpTransport.create()` when `ServiceLoader` returns no providers (a
defensive measure for heavily-shaded uber-jars that strip `META-INF/services`
files).
+
+**Package promotion:**
+
+`JavaHttpTransport`, `JavaHttpTransportBuilder`, and
`JavaHttpTransportProvider` were promoted from
`org.apache.juneau.rest.client.javahttpclient.*` to the canonical
`org.apache.juneau.rest.client.*` package root. No previously released version
exposed the `javahttpclient` package, so this is an internal restructuring of
unreleased beta code — no migration steps required.
+
+```java
+// Zero-config: uses the built-in JavaHttpTransport
+try (var req = RestClient.create().get("https://api.example.com/users")) {
+ var users = req.run().as(User[].class);
+}
+
+// Explicit tuning of the JDK client
+var transport = JavaHttpTransport.builder()
+ .httpClient(java.net.http.HttpClient.newBuilder()
+ .connectTimeout(Duration.ofSeconds(5))
+ .build())
+ .build();
+RestClient client = RestClient.builder().transport(transport).build();
+
+// Or swap to a different transport entirely just by adding its module
+// (no code change needed — ServiceLoader picks up the higher-priority
provider)
+```
+
### juneau-bean-mcp (new module)
A new bean module, `juneau-bean-mcp`, models the [Model Context
Protocol](https://modelcontextprotocol.io/) wire format as Juneau `@Bean`
POJOs. The beans round-trip cleanly through any Juneau serializer/parser (JSON,
JSON5, MessagePack, CBOR, YAML, etc.) and were the foundation for
`juneau-rest-server-mcp`.
diff --git a/pages/topics/09.01.JuneauRestCommonBasics.md
b/pages/topics/09.01.JuneauRestCommonBasics.md
index 273caf05b7..0acb93a1cd 100644
--- a/pages/topics/09.01.JuneauRestCommonBasics.md
+++ b/pages/topics/09.01.JuneauRestCommonBasics.md
@@ -3,8 +3,17 @@ title: "juneau-rest-common Basics"
slug: JuneauRestCommonBasics
---
+`juneau-rest-common` ships as two sibling Maven artifacts:
+
+| Artifact | Contents | Apache HttpClient 4.5 dependency? |
+|---|---|---|
+| `juneau-rest-common` | Transport-neutral types under
`org.apache.juneau.http.*` and `org.apache.juneau.http.remote.*` — annotations,
lazy header beans, remote-proxy meta, transport-neutral parts. Used by every
`juneau-rest-*` module. | **No.** Zero `org.apache.httpcomponents:*` on the
classpath. |
+| `juneau-rest-common-classic` | Apache HttpClient 4.5–compatible facades
under `org.apache.juneau.http.classic.*` — `BasicHeader`,
`BasicMediaTypeHeader`, `BasicHttpEntity`, `BasicHttpResponse`,
response/exception classes, `HeaderList`, etc. (~170 types). | **Yes.** Depends
on `juneau-rest-common` and `org.apache.httpcomponents:httpcore:4.4.16`. |
+
#### Maven Dependency
+For NG (transport-neutral) consumers — the canonical path:
+
```xml
<dependency>
<groupId>org.apache.juneau</groupId>
@@ -13,37 +22,61 @@ slug: JuneauRestCommonBasics
</dependency>
```
+For code that uses any `org.apache.juneau.http.classic.*` facade (e.g.
`BasicHeader`, `BasicHttpResponse`, `HeaderList`), add **both** artifacts:
+
+```xml
+<dependency>
+ <groupId>org.apache.juneau</groupId>
+ <artifactId>juneau-rest-common</artifactId>
+ <version>${juneau.version}</version>
+</dependency>
+<dependency>
+ <groupId>org.apache.juneau</groupId>
+ <artifactId>juneau-rest-common-classic</artifactId>
+ <version>${juneau.version}</version>
+</dependency>
+```
+
+The aggregator artifacts (`juneau-rest-server`, `juneau-rest-client-classic`,
`juneau-rest-mock`, `juneau-microservice`, `juneau-rest-server-springboot`,
`juneau-shaded-rest-server`, `juneau-shaded-rest-client`, `juneau-shaded-all`,
`juneau-distrib`) already pull both modules in transitively, so most callers
don't need to declare them directly.
+
#### Java Library
```text
juneau-rest-common-0.0.0.jar
+juneau-rest-common-classic-0.0.0.jar
```
#### OSGi Module
```text
org.apache.juneau.rest.common_0.0.0.jar
+org.apache.juneau.rest.common.classic_0.0.0.jar
```
#### Contents/Features
-The <a href="/site/apidocs/org/apache/juneau/http/package-summary.html"
target="_blank">org.apache.juneau.http</a> package contains a slew of useful
extensions to the Apache
-HttpComponents libraries and define APIs used extensively in the REST server
and client APIs.
+The transport-neutral packages in `juneau-rest-common`:
<tree>
-<node-0>HTTP Packages</node-0>
-<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/package-summary.html"
target="_blank">org.apache.juneau.http</a></java-package> - Utility classes
used for HTTP parts/headers/entities.</node-1>
+<node-0>Transport-neutral HTTP packages (no Apache HttpClient 4.5
dependency)</node-0>
+<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/package-summary.html"
target="_blank">org.apache.juneau.http</a></java-package> - Static
`HttpHeaders` factory facade and shared utilities.</node-1>
<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/annotation/package-summary.html"
target="_blank">org.apache.juneau.http.annotation</a></java-package> -
Swagger-based annotations used on both server-side APIs and client-side proxy
interfaces.</node-1>
-<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/entity/package-summary.html"
target="_blank">org.apache.juneau.http.entity</a></java-package> - HTTP entity
classes.</node-1>
-<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/header/package-summary.html"
target="_blank">org.apache.juneau.http.header</a></java-package> - HTTP header
classes.</node-1>
+<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/header/package-summary.html"
target="_blank">org.apache.juneau.http.header</a></java-package> -
Lazy-resolved HTTP header beans (no Apache `Header` interface dependency) and
the `EntityTag` / `EntityTags` value types.</node-1>
<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/part/package-summary.html"
target="_blank">org.apache.juneau.http.part</a></java-package> - HTTP
query/form-data/path classes.</node-1>
-<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/remote/package-summary.html"
target="_blank">org.apache.juneau.http.remote</a></java-package> - Remote proxy
interface API</node-1>
-<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/resource/package-summary.html"
target="_blank">org.apache.juneau.http.resource</a></java-package> - HTTP
resource classes.</node-1>
-<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/response/package-summary.html"
target="_blank">org.apache.juneau.http.response</a></java-package> - HTTP
response classes.</node-1>
+<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/remote/package-summary.html"
target="_blank">org.apache.juneau.http.remote</a></java-package> - `@Remote` /
`@RemoteOp` / `@RemoteGet` / etc. proxy-interface annotations.</node-1>
+</tree>
+
+The Apache HttpClient 4.5–compatible facades in `juneau-rest-common-classic`:
+
+<tree>
+<node-0>Apache HttpClient 4.5–compatible facades</node-0>
+<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/classic/package-summary.html"
target="_blank">org.apache.juneau.http.classic</a></java-package> - Classic
`HttpHeaders`, `HttpEntities`, `HttpResponses`, `HttpParts` facades.</node-1>
+<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/classic/entity/package-summary.html"
target="_blank">org.apache.juneau.http.classic.entity</a></java-package> - HTTP
entity classes built on `org.apache.http.HttpEntity`.</node-1>
+<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/classic/header/package-summary.html"
target="_blank">org.apache.juneau.http.classic.header</a></java-package> - HTTP
header classes built on `org.apache.http.Header`, plus `HeaderList`.</node-1>
+<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/classic/part/package-summary.html"
target="_blank">org.apache.juneau.http.classic.part</a></java-package> - HTTP
part classes built on `org.apache.http.NameValuePair`.</node-1>
+<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/classic/remote/package-summary.html"
target="_blank">org.apache.juneau.http.classic.remote</a></java-package> -
Classic RRPC interface meta types used by the classic REST client.</node-1>
+<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/classic/resource/package-summary.html"
target="_blank">org.apache.juneau.http.classic.resource</a></java-package> -
HTTP resource classes (entity + headers bundle).</node-1>
+<node-1><java-package><a
href="/site/apidocs/org/apache/juneau/http/classic/response/package-summary.html"
target="_blank">org.apache.juneau.http.classic.response</a></java-package> -
HTTP response / exception classes built on
`org.apache.http.HttpResponse`.</node-1>
</tree>
-These APIs extend from the Apache HttpComponents libraries and can be used
with libraries based on it such as Apache
-HttpClient.
-The REST Client API described later is built on top of Apache HttpClient and
many of the classes defined in this package
-make up integral components of that API.
-Likewise, the APIs defined here are also used in the REST Server APIs also
described later.
+These classic APIs extend the Apache HttpComponents 4.5 libraries and are
consumed by `juneau-rest-server`, `juneau-rest-client-classic`, and
`juneau-rest-mock` (classic flavor). The canonical NG REST client built on top
of `juneau-rest-common` is fully decoupled from Apache HttpClient.
diff --git a/pages/topics/12.15.NextGenRestClient.md
b/pages/topics/12.15.NextGenRestClient.md
index c6d3a814ac..18cdf7c869 100644
--- a/pages/topics/12.15.NextGenRestClient.md
+++ b/pages/topics/12.15.NextGenRestClient.md
@@ -45,19 +45,22 @@ The next-generation stack:
## Transport Modules
-Each transport is a separate Maven module pulling in only its native HTTP
client.
-The `HttpTransportProvider` `ServiceLoader` SPI auto-discovers the
highest-priority transport
-on the classpath at `build()` time when no explicit transport is passed.
+The JDK `HttpClient`–based `JavaHttpTransport` is built into the canonical
`juneau-rest-client`
+artifact and is the default — it requires no third-party dependencies on Java
11+.
+
+To swap to a different native HTTP client, add one of the optional transport
modules below. Each
+ships only its own native client and registers a higher-priority
`HttpTransportProvider` via
+`ServiceLoader`, which automatically takes over discovery. An explicit
+`RestClient.builder().transport(...)` call always wins.
| Module | Artifact ID | Native client |
|---|---|---|
| Apache HttpClient 4.5 | `juneau-rest-client-apache-httpclient-45` |
`org.apache.httpcomponents:httpclient:4.5.x` |
| Apache HttpClient 5 | `juneau-rest-client-apache-httpclient-50` |
`org.apache.httpcomponents.client5:httpclient5` |
-| JDK `HttpClient` | `juneau-rest-client-java-httpclient` |
`java.net.http.HttpClient` (Java 11+) — zero third-party deps |
| OkHttp | `juneau-rest-client-okhttp` | `com.squareup.okhttp3:okhttp` |
| Eclipse Jetty client | `juneau-rest-client-jetty` |
`org.eclipse.jetty:jetty-client` |
-Each module ships three classes:
+Each optional module ships three classes:
- `*Transport` — the `HttpTransport` implementation.
- `*TransportBuilder` — extends `HttpTransportBuilder` with
native-client–specific options
@@ -177,10 +180,9 @@ Logging is framework-agnostic via
`java.lang.System.Logger`:
```java
RestClient client = RestClient.create()
- .transportBuilder(JavaHttpTransport.create())
.marshaller(Json5.DEFAULT)
.logger(BasicRestLogger.of(System.getLogger("myapp.http")))
- .build();
+ .build(); // uses the built-in JavaHttpTransport by default
// Per-request verbose logging
try (var req = client.get("/users/123").debug()) {
diff --git a/pages/topics/20.03.JuneauShadedRestClient.md
b/pages/topics/20.03.JuneauShadedRestClient.md
index 32e1593f8e..976e94305e 100644
--- a/pages/topics/20.03.JuneauShadedRestClient.md
+++ b/pages/topics/20.03.JuneauShadedRestClient.md
@@ -70,10 +70,10 @@ java_binary(
`juneau-shaded-rest-client` requires:
### Required
-- **Apache HttpClient 4.5.x** - bundled via `juneau-rest-client-classic` for
the legacy client. The canonical `juneau-rest-client` artifact itself has **no
Apache HttpClient dependency** — it composes any `HttpTransport` implementation
you put on the classpath (HC 4.5, HC 5, JDK `HttpClient`, OkHttp, Jetty client,
or a custom transport).
+- **Apache HttpClient 4.5.x** - bundled via `juneau-rest-client-classic` for
the legacy client. The canonical `juneau-rest-client` artifact itself has **no
Apache HttpClient dependency** — it ships with a built-in `JavaHttpTransport`
backed by the JDK's `java.net.http.HttpClient` and works out of the box on Java
11+.
### Optional
-- **Apache HttpClient 5.x** / **`java.net.http.HttpClient`** / **OkHttp** /
**Jetty client** - pick one of the `juneau-rest-client-apache-httpclient-50` /
`juneau-rest-client-java-httpclient` / `juneau-rest-client-okhttp` /
`juneau-rest-client-jetty` transport modules to drive the canonical
`RestClient` over a non-HC-4.5 transport.
+- **Apache HttpClient 4.5.x** / **Apache HttpClient 5.x** / **OkHttp** /
**Jetty client** - to swap the default JDK-`HttpClient`-based transport for a
different native HTTP client, pull in one of the
`juneau-rest-client-apache-httpclient-45` /
`juneau-rest-client-apache-httpclient-50` / `juneau-rest-client-okhttp` /
`juneau-rest-client-jetty` transport modules. Each registers a higher-priority
`HttpTransportProvider` via `ServiceLoader` and is picked up automatically.
- **Jakarta XML Bind API 3.0+** - For XML serialization
- **Apache Jena** - For RDF support
diff --git a/pages/topics/23.01.V9.5-migration-guide.md
b/pages/topics/23.01.V9.5-migration-guide.md
index 003f51ff4b..a38f51cda4 100644
--- a/pages/topics/23.01.V9.5-migration-guide.md
+++ b/pages/topics/23.01.V9.5-migration-guide.md
@@ -339,5 +339,36 @@ The package promotion changes the canonical imports for
every `juneau-rest-commo
The new canonical `org.apache.juneau.http.*` (and sub-packages `entity` /
`header` / `part` / `response`) host the JDK-native NG types. The
`org.apache.juneau.http.remote.*` annotation package (`@Remote`, `@RemoteGet`,
etc.) **did not move**.
+## `juneau-rest-common` Module Split (TODO-42)
+
+Continues the work started in TODO-38: `juneau-rest-common` is now split into
a pure, transport-neutral module and a new sibling that owns every Apache
HttpClient 4.5–style facade. After the split, `juneau-rest-common` no longer
drags `org.apache.httpcomponents:httpcore` onto every downstream consumer.
+
+### Maven module changes
+
+| Old (single artifact) | New (two artifacts) | Notes |
+|-----|-----|-------|
+| `<artifactId>juneau-rest-common</artifactId>` *(carries `httpcore`
transitively)* | `<artifactId>juneau-rest-common</artifactId>`
*(transport-neutral, **no** `httpcore`)* **and/or**
`<artifactId>juneau-rest-common-classic</artifactId>` *(new, depends on
`httpcore`)* | Code using only `org.apache.juneau.http.*` /
`org.apache.juneau.http.header.*` / `org.apache.juneau.http.remote.*` /
`org.apache.juneau.http.part.*` / `org.apache.juneau.http.entity.*` /
`org.apache.juneau.http.response.* [...]
+
+### Class moves (source-incompatible)
+
+`EntityTag` and `EntityTags` are pure value types with no `org.apache.http.*`
dependency despite their historical package. They moved out of
`org.apache.juneau.http.classic.header` so the transport-neutral header beans
that already stored them (`HttpEntityTagHeader`, `HttpEntityTagsHeader`,
`IfMatch`, `IfNoneMatch`, `IfRange`, `ETag`, top-level `HttpHeaders`) can stay
free of the classic dependency.
+
+| Old | New | Notes |
+|-----|-----|-------|
+| `import org.apache.juneau.http.classic.header.EntityTag;` | `import
org.apache.juneau.http.header.EntityTag;` | Update the import. FQCN is the only
thing that changed; constructor / `of(...)` / accessors are unchanged. |
+| `import org.apache.juneau.http.classic.header.EntityTags;` | `import
org.apache.juneau.http.header.EntityTags;` | Update the import. FQCN is the
only thing that changed. |
+
+Every other `org.apache.juneau.http.classic.*` type stayed in place — only the
**Maven coordinate** that publishes them moved. `import
org.apache.juneau.http.classic.header.HeaderList;` still resolves; you just
need `juneau-rest-common-classic` on the classpath rather than
`juneau-rest-common`.
+
+### `@Remote` annotation change
+
+`@Remote` is transport-neutral (both the NG and classic clients consume it).
To keep `@Remote` out of the classic Maven coordinate, the `headerList()`
method's return type was widened from `Class<? extends HeaderList>` to
`Class<?>`, and the default sentinel changed from `HeaderList.Void.class` to
`java.lang.Void.class`.
+
+| Old | New | Notes |
+|-----|-----|-------|
+| `@Remote(headerList = MyHeaderList.class)` *(where `MyHeaderList extends
org.apache.juneau.http.classic.header.HeaderList`)* | `@Remote(headerList =
MyHeaderList.class)` *(unchanged)* | Source-compatible — user annotations
continue to work. The classic `RemoteMeta` now performs an `instanceof
HeaderList` check at runtime before invoking the constructor, so
non-`HeaderList` values are silently ignored rather than causing a
`ClassCastException`. |
+| `Class<? extends HeaderList> hl =
Remote.class.getMethod("headerList").getReturnType().asSubclass(HeaderList.class);`
| `Class<?> hl = remoteAnnotation.headerList();` followed by an explicit
`isAssignableFrom` check before use. | Reflective callers must cast/check
explicitly. |
+| `Remote.headerList()` default was `HeaderList.Void.class`. | Default is
`java.lang.Void.class`. | The framework's `isVoid` check still recognizes the
default and skips header-list resolution. |
+
<!-- Additional rows will be populated as 9.5 breaking changes land. See
todo/TODO-17 for the
ongoing 9.5.0 audit. -->