From 8d5521c2a7ade1859a76a8f43ae91bce8e254efe Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Thu, 9 Apr 2026 03:22:49 +0700
Subject: [PATCH 01/15] agents: update plans
---
jooby/phase-2-plans.md | 46 ---------------------------------
jooby/phase-3-plans.md | 58 ++++++++++++++++++++++++++++++++++++++++++
killbill-jooby-todo.md | 14 +++++-----
3 files changed, 66 insertions(+), 52 deletions(-)
delete mode 100644 jooby/phase-2-plans.md
create mode 100644 jooby/phase-3-plans.md
diff --git a/jooby/phase-2-plans.md b/jooby/phase-2-plans.md
deleted file mode 100644
index 28292598..00000000
--- a/jooby/phase-2-plans.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# Phase 2 Plans
-
-This document records the current Jooby fork baseline that Phase 2 work should preserve while
-upgrading the repository foundation.
-
-## Current Baseline
-
-- Root build baseline validated on Temurin **JDK 17.0.18** with **Maven 3.8.5**
-- Root build command used for baseline:
- - `mvn -q clean install -DskipTests`
-- Jooby module test baseline:
- - `mvn clean test`
-- Active Jooby test tree:
- - `124` Java files in `src/test/java`
- - `108` runnable test classes
- - `923` tests
- - `src/test/java-excluded/` is empty
-
-## Current Dependency Baseline Relevant to Phase 2
-
-| Area | Current state |
-|---|---|
-| JDK target | Repository baseline is now JDK 17 via root `project.build.targetJdk` override |
-| Guice | `com.google.inject:guice` is now pinned to `6.0.0` via root dependency management override |
-| Guice servlet bridge | `com.google.inject.extensions:guice-servlet` is now pinned to `6.0.0` via root dependency management override |
-| Inject namespace | Source still uses `javax.inject`; `javax.inject:javax.inject` is explicitly declared in the Jooby fork |
-| Servlet namespace | `jakarta.servlet:jakarta.servlet-api:4.0.4` is used as a transitional artifact and still exposes `javax.servlet` packages |
-| Jetty | Jetty already sits on `10.0.16` in the fork |
-
-## Phase 2 Sequence
-
-Phase 2 foundation work is complete. The next step is Phase 3 Jakarta namespace migration.
-
-## Notes
-
-- `jooby/CHANGES.md` now focuses on durable source, dependency, and test-tree changes rather than
- phased execution history.
-- The Jooby module is a useful canary for Phase 2 because it already exercises Guice, servlet, Jetty,
- and a large migrated Mockito-based test tree.
-- The old `-Pjooby` test gate was removed after the active test tree was fully restored.
-- JDK 17 does not need to be the machine default, but Phase 2 validation must run Maven in a shell
- that has JDK 17 selected explicitly when multiple JDKs are installed.
-- Root `surefireArgLine` now overrides the parent's JDK 17 profile so test JVMs no longer use
- `--illegal-access=permit` or the invalid `--add-opens java.base/java.base=ALL-UNNAMED` flag.
-- Full reactor tests, plus focused `jooby`, `skeleton`, `metrics`, and `queue` test runs, passed
- with JDK 17 + Guice 6.0.0.
diff --git a/jooby/phase-3-plans.md b/jooby/phase-3-plans.md
new file mode 100644
index 00000000..1127a231
--- /dev/null
+++ b/jooby/phase-3-plans.md
@@ -0,0 +1,58 @@
+# Phase 3 Plans
+
+This document records the current Jooby fork baseline and Phase 3 constraints while the repository
+moves from `javax.*` to `jakarta.*`.
+
+## Current Baseline
+
+- Repository baseline validated on Temurin **JDK 17.0.18** with **Maven 3.8.5**
+- Root dependency baseline:
+ - `project.build.targetJdk=17`
+ - `com.google.inject:guice=6.0.0`
+ - `com.google.inject.extensions:guice-servlet=6.0.0`
+- Root build baseline:
+ - `mvn -q clean install -DskipTests`
+- Root test baseline:
+ - `mvn clean test`
+- Jooby module test baseline:
+ - `mvn clean test`
+- Active Jooby test tree:
+ - `124` Java files in `src/test/java`
+ - `108` runnable test classes
+ - `923` tests
+ - `src/test/java-excluded/` is empty
+
+## Current Dependency Baseline Relevant to Phase 3
+
+| Area | Current state |
+|---|---|
+| Inject namespace | `killbill-jooby`, `queue`, `jdbi`, and `metrics` now use `jakarta.inject`; `skeleton` remains on `javax.inject` until Jersey 2 / HK2 is replaced |
+| Servlet namespace | `jakarta.servlet:jakarta.servlet-api:4.0.4` is still a transitional artifact that exposes `javax.servlet` packages |
+| JAX-RS namespace | `skeleton` still uses `javax.ws.rs` with Jersey 2.39.1 |
+| Guice servlet bridge | `guice-servlet` is still `6.0.0`, so servlet integration remains on the `javax.servlet` side |
+| Jetty | The Jooby fork already runs on Jetty `10.0.16` |
+
+## Phase 3 Sequence
+
+1. `javax.inject` -> `jakarta.inject` for modules not blocked by Jersey 2 / HK2
+2. `javax.servlet` -> `jakarta.servlet`
+3. `javax.ws.rs` -> `jakarta.ws.rs` plus Jersey 3
+4. Upgrade to Guice 7 once the earlier Jakarta steps are ready
+
+## Phase 3 Notes
+
+- `jooby/CHANGES.md` is the durable source of truth for fork differences from upstream Jooby 1.6.9.
+- The Jooby module is still the best canary because it exercises Guice, servlet, Jetty, and the
+ migrated Mockito-based test tree in one module.
+- The old `-Pjooby` test gate is gone; Jooby tests run in the standard Maven lifecycle.
+- JDK 17 does not need to be the machine default, but Maven commands for this phase must run in a
+ shell that has JDK 17 selected explicitly when multiple JDKs are installed.
+- Root `surefireArgLine` already overrides the parent's obsolete JDK 17 profile flags.
+- Full reactor tests, plus focused `jooby`, `skeleton`, `metrics`, and `queue` test runs, already
+ passed with JDK 17 + Guice 6.0.0.
+- `guice-servlet` 6.0.0 still uses `javax.servlet`; that makes Phase 3 servlet work awkward until
+ the Guice 7 step is taken or coordinated with it.
+- Guice 6 accepts `jakarta.inject` annotations, but provider-facing Jooby code still needs
+ `com.google.inject.Provider` when interacting with Guice binding APIs.
+- `skeleton` must stay on `javax.inject` until the Jersey 2 / HK2 layer is migrated because HK2
+ still enforces `javax.inject.Singleton` semantics during Jersey bootstrap.
diff --git a/killbill-jooby-todo.md b/killbill-jooby-todo.md
index f62a4c0a..4337f3d1 100644
--- a/killbill-jooby-todo.md
+++ b/killbill-jooby-todo.md
@@ -16,8 +16,9 @@
- `jakarta.ws.rs:jakarta.ws.rs-api` in `skeleton` (code uses `javax.ws.rs.*`).
- `jakarta.xml.bind:jakarta.xml.bind-api` in `automaton`, `xmlloader` (code uses `javax.xml.bind.*`).
- `jakarta.activation:jakarta.activation-api` in `automaton`, `xmlloader`.
-- `javax.inject:javax.inject` is still the Maven artifact in 4 modules: `skeleton` (5 files), `queue` (4 files), `jdbi` (2 files), `metrics` (1 file).
-- Guice version is **5.1.0** (managed by `killbill-oss-parent`; supports `javax.inject` only).
+- `jakarta.inject:jakarta.inject-api` is now the explicit Maven artifact in `killbill-jooby`, `queue`, `jdbi`, and `metrics`.
+- `skeleton` still uses `javax.inject` for now because Jersey 2 / HK2 still expects that namespace.
+- Guice version is **6.0.0** (overridden in this repository; supports both `javax.inject` and `jakarta.inject` annotations).
- Jersey version is **2.39.1** (supports `javax.ws.rs` only; Jersey 3.x requires `jakarta.ws.rs`).
- `javax.servlet` imports span 12 files: `skeleton` (8 files), `metrics` (4 files).
- `javax.ws.rs` imports span 6 files: `skeleton` only.
@@ -103,7 +104,7 @@
- Apache RAT exclusions added for resource files and the temporary migration layout.
- Removed `spotbugs-annotations` dependency (no upstream source uses `@SuppressFBWarnings`).
- Removed `websocket-jetty-server` dependency (WebSocket factory code removed from Jetty adapter).
-- Added explicit deps for `websocket-jetty-api`, `jetty-io`, `jetty-util`, `javax.inject` (transitive but used directly).
+- Added explicit deps for `websocket-jetty-api`, `jetty-io`, `jetty-util`, `jakarta.inject-api` (annotations) and kept Guice-provider-compatible code paths where needed.
## 7. Migrate EasyMock + PowerMock to Mockito ✅
@@ -177,7 +178,7 @@
---
-# Phase 2 — JDK & Guice Foundation Upgrades
+# Phase 2 — JDK & Guice Foundation Upgrades ✅
> These steps prepare the foundation for the Jakarta namespace migration.
> They do NOT change any `javax.*` imports — only upgrade the JDK and Guice versions.
@@ -212,8 +213,9 @@
- Replace `javax.inject:javax.inject` with `jakarta.inject:jakarta.inject-api:2.0.1` in all POMs.
- In all Java source files, replace `import javax.inject.*` with `import jakarta.inject.*`.
- - Affected modules: `skeleton` (5 files), `queue` (4 files), `jdbi` (2 files), `metrics` (1 file), and `killbill-jooby` (forked Jooby source).
- - Affected annotations: `@Inject`, `@Named`, `@Singleton`, `@Provider`.
+ - Completed in-repo for `killbill-jooby`, `queue`, `jdbi`, and `metrics`.
+ - `skeleton` is intentionally deferred: Jersey 2 / HK2 still expects `javax.inject` semantics there.
+ - Affected annotations: `@Inject`, `@Named`, `@Singleton`, `@Qualifier`, `@Scope`.
- Verify Guice 6.0 resolves `jakarta.inject` annotations correctly alongside any remaining `javax.inject` from transitive deps.
- Run the full test suite to confirm no injection failures.
From 83044d13339e007fdb4dab44c74fe3dfd8ff7cf8 Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Thu, 9 Apr 2026 03:35:49 +0700
Subject: [PATCH 02/15] jooby: migrate queue, jdbi, metrics and jooby modules
to jakarta.inject
---
config-magic/pom.xml | 2 +-
jdbi/pom.xml | 4 ++--
.../commons/jdbi/guice/DBIProvider.java | 4 ++--
.../commons/jdbi/guice/DataSourceProvider.java | 4 ++--
jooby/CHANGES.md | 2 +-
jooby/pom.xml | 6 +++---
jooby/src/main/java/org/jooby/Jooby.java | 4 ++--
.../src/main/java/org/jooby/handlers/Cors.java | 4 ++--
.../jooby/internal/CookieSessionManager.java | 4 ++--
.../org/jooby/internal/HttpHandlerImpl.java | 8 ++++----
.../java/org/jooby/internal/RequestScope.java | 6 +++---
.../jooby/internal/ServerSessionManager.java | 4 ++--
.../org/jooby/internal/StatusCodeProvider.java | 2 +-
.../org/jooby/internal/jetty/JettyServer.java | 4 ++--
.../org/jooby/internal/mvc/RequestParam.java | 2 +-
.../jooby/internal/parser/LocalDateParser.java | 2 +-
.../jooby/internal/parser/ParserExecutor.java | 2 +-
.../internal/parser/ZonedDateTimeParser.java | 2 +-
.../jooby/internal/parser/bean/BeanPlan.java | 2 +-
.../jooby/internal/ssl/SslContextProvider.java | 4 ++--
jooby/src/main/java/org/jooby/jetty/Jetty.java | 2 +-
jooby/src/main/java/org/jooby/json/Jackson.java | 2 +-
jooby/src/main/java/org/jooby/mvc/Header.java | 2 +-
.../main/java/org/jooby/scope/Providers.java | 2 +-
.../java/org/jooby/scope/RequestScoped.java | 2 +-
jooby/src/test/java/org/jooby/JoobyTest.java | 4 ++--
.../jooby/internal/jetty/JettyServerTest.java | 2 +-
.../jooby/internal/mvc/RequestParamTest.java | 2 +-
.../org/jooby/internal/parser/BeanPlanTest.java | 2 +-
metrics-api/pom.xml | 2 +-
metrics/pom.xml | 8 ++++----
.../health/KillBillHealthCheckRegistry.java | 2 +-
pom.xml | 17 +++++++++++++++++
queue/pom.xml | 4 ++--
.../org/killbill/bus/DefaultPersistentBus.java | 4 ++--
.../org/killbill/bus/InMemoryPersistentBus.java | 2 +-
.../DefaultNotificationQueueService.java | 4 ++--
.../MockNotificationQueueService.java | 2 +-
38 files changed, 77 insertions(+), 60 deletions(-)
diff --git a/config-magic/pom.xml b/config-magic/pom.xml
index 1036a4be..3bd9084a 100644
--- a/config-magic/pom.xml
+++ b/config-magic/pom.xml
@@ -66,7 +66,7 @@
maven-surefire-plugin
-
+
diff --git a/jdbi/pom.xml b/jdbi/pom.xml
index 76da8011..7baec0e6 100644
--- a/jdbi/pom.xml
+++ b/jdbi/pom.xml
@@ -59,8 +59,8 @@
- javax.inject
- javax.inject
+ jakarta.inject
+ jakarta.inject-api
joda-time
diff --git a/jdbi/src/main/java/org/killbill/commons/jdbi/guice/DBIProvider.java b/jdbi/src/main/java/org/killbill/commons/jdbi/guice/DBIProvider.java
index 19bcd579..bfa9bc80 100644
--- a/jdbi/src/main/java/org/killbill/commons/jdbi/guice/DBIProvider.java
+++ b/jdbi/src/main/java/org/killbill/commons/jdbi/guice/DBIProvider.java
@@ -23,8 +23,8 @@
import java.util.Set;
import javax.annotation.Nullable;
-import javax.inject.Inject;
-import javax.inject.Provider;
+import jakarta.inject.Inject;
+import jakarta.inject.Provider;
import javax.sql.DataSource;
import org.killbill.commons.jdbi.argument.DateTimeArgumentFactory;
diff --git a/jdbi/src/main/java/org/killbill/commons/jdbi/guice/DataSourceProvider.java b/jdbi/src/main/java/org/killbill/commons/jdbi/guice/DataSourceProvider.java
index d1431354..a7911459 100644
--- a/jdbi/src/main/java/org/killbill/commons/jdbi/guice/DataSourceProvider.java
+++ b/jdbi/src/main/java/org/killbill/commons/jdbi/guice/DataSourceProvider.java
@@ -25,8 +25,8 @@
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
-import javax.inject.Inject;
-import javax.inject.Provider;
+import jakarta.inject.Inject;
+import jakarta.inject.Provider;
import javax.sql.DataSource;
import org.killbill.commons.embeddeddb.EmbeddedDB;
diff --git a/jooby/CHANGES.md b/jooby/CHANGES.md
index e98b9b99..c6f18474 100644
--- a/jooby/CHANGES.md
+++ b/jooby/CHANGES.md
@@ -59,7 +59,7 @@ Differences from upstream dependency versions:
| `org.eclipse.jetty.websocket:websocket-jetty-api` | not present (was part of websocket-server) | 10.0.16 | Jetty 10 split WebSocket API into separate artifact |
| `org.eclipse.jetty:jetty-io` | transitive | 10.0.16 (explicit) | Used directly in source; declared explicitly to satisfy dependency:analyze |
| `org.eclipse.jetty:jetty-util` | transitive | 10.0.16 (explicit) | Used directly in source; declared explicitly to satisfy dependency:analyze |
-| `javax.inject:javax.inject` | transitive via Guice | managed (explicit) | Used directly in source; declared explicitly to satisfy dependency:analyze |
+| `jakarta.inject:jakarta.inject-api` | transitive via Guice | 2.0.1 (managed in root pom, explicit in fork) | Used directly for injection annotations; provider-facing Guice bindings still use `com.google.inject.Provider` where required |
| `junit:junit` | optional (compile) | compile + optional | Parent forces test scope; explicit compile needed for `JoobyRule` |
| `org.mockito:mockito-core` | not present | 5.3.1 (managed, test) | Sole active mocking framework for the migrated test tree |
| `org.easymock:easymock` | present (test) | **removed** | Replaced by mockito-core in the active test tree |
diff --git a/jooby/pom.xml b/jooby/pom.xml
index a78aa0c1..8f747ad1 100644
--- a/jooby/pom.xml
+++ b/jooby/pom.xml
@@ -103,10 +103,10 @@
jetty-util
${jetty.version}
-
+
- javax.inject
- javax.inject
+ jakarta.inject
+ jakarta.inject-api
diff --git a/jooby/src/main/java/org/jooby/Jooby.java b/jooby/src/main/java/org/jooby/Jooby.java
index 0abfb177..a4e8ffa5 100644
--- a/jooby/src/main/java/org/jooby/Jooby.java
+++ b/jooby/src/main/java/org/jooby/Jooby.java
@@ -101,7 +101,7 @@
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.lang.reflect.Type;
@@ -3250,7 +3250,7 @@ private static void install(final Logger log, final Jooby.Module module, final E
/**
* Bind a {@link Config} and make it available for injection. Each property of the config is also
- * binded it and ready to be injected with {@link javax.inject.Named}.
+ * binded it and ready to be injected with {@link jakarta.inject.Named}.
*
* @param binder Guice binder.
* @param config App config.
diff --git a/jooby/src/main/java/org/jooby/handlers/Cors.java b/jooby/src/main/java/org/jooby/handlers/Cors.java
index c1fa7cfd..ad6e1fa0 100644
--- a/jooby/src/main/java/org/jooby/handlers/Cors.java
+++ b/jooby/src/main/java/org/jooby/handlers/Cors.java
@@ -25,8 +25,8 @@
import java.util.regex.Pattern;
import java.util.stream.Collectors;
-import javax.inject.Inject;
-import javax.inject.Named;
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
import com.google.common.collect.ImmutableList;
import com.typesafe.config.Config;
diff --git a/jooby/src/main/java/org/jooby/internal/CookieSessionManager.java b/jooby/src/main/java/org/jooby/internal/CookieSessionManager.java
index 97d9fade..d931bb3b 100644
--- a/jooby/src/main/java/org/jooby/internal/CookieSessionManager.java
+++ b/jooby/src/main/java/org/jooby/internal/CookieSessionManager.java
@@ -25,8 +25,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.inject.Inject;
-import javax.inject.Named;
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
diff --git a/jooby/src/main/java/org/jooby/internal/HttpHandlerImpl.java b/jooby/src/main/java/org/jooby/internal/HttpHandlerImpl.java
index fef1c095..931ad7cb 100644
--- a/jooby/src/main/java/org/jooby/internal/HttpHandlerImpl.java
+++ b/jooby/src/main/java/org/jooby/internal/HttpHandlerImpl.java
@@ -48,10 +48,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Provider;
-import javax.inject.Singleton;
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
+import com.google.inject.Provider;
+import jakarta.inject.Singleton;
import java.nio.charset.Charset;
import java.text.MessageFormat;
import java.util.ArrayList;
diff --git a/jooby/src/main/java/org/jooby/internal/RequestScope.java b/jooby/src/main/java/org/jooby/internal/RequestScope.java
index 7a798738..703f0ef1 100644
--- a/jooby/src/main/java/org/jooby/internal/RequestScope.java
+++ b/jooby/src/main/java/org/jooby/internal/RequestScope.java
@@ -52,9 +52,9 @@ public Provider scope(final Key key, final Provider unscoped) {
scopedObjects.put(key, current);
}
- if (current instanceof javax.inject.Provider) {
- if (!javax.inject.Provider.class.isAssignableFrom(key.getTypeLiteral().getRawType())) {
- return (T) ((javax.inject.Provider) current).get();
+ if (current instanceof com.google.inject.Provider) {
+ if (!com.google.inject.Provider.class.isAssignableFrom(key.getTypeLiteral().getRawType())) {
+ return (T) ((com.google.inject.Provider) current).get();
}
}
return current;
diff --git a/jooby/src/main/java/org/jooby/internal/ServerSessionManager.java b/jooby/src/main/java/org/jooby/internal/ServerSessionManager.java
index 4b39fc15..076f9bea 100644
--- a/jooby/src/main/java/org/jooby/internal/ServerSessionManager.java
+++ b/jooby/src/main/java/org/jooby/internal/ServerSessionManager.java
@@ -38,8 +38,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.inject.Inject;
-import javax.inject.Singleton;
+import jakarta.inject.Inject;
+import jakarta.inject.Singleton;
import java.util.concurrent.TimeUnit;
@Singleton
diff --git a/jooby/src/main/java/org/jooby/internal/StatusCodeProvider.java b/jooby/src/main/java/org/jooby/internal/StatusCodeProvider.java
index 9bc2f074..eed72970 100644
--- a/jooby/src/main/java/org/jooby/internal/StatusCodeProvider.java
+++ b/jooby/src/main/java/org/jooby/internal/StatusCodeProvider.java
@@ -18,7 +18,7 @@
import java.util.Optional;
import java.util.function.Function;
-import javax.inject.Inject;
+import jakarta.inject.Inject;
import org.jooby.Err;
import org.jooby.Status;
diff --git a/jooby/src/main/java/org/jooby/internal/jetty/JettyServer.java b/jooby/src/main/java/org/jooby/internal/jetty/JettyServer.java
index 0c7c5f61..04861918 100644
--- a/jooby/src/main/java/org/jooby/internal/jetty/JettyServer.java
+++ b/jooby/src/main/java/org/jooby/internal/jetty/JettyServer.java
@@ -35,8 +35,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.inject.Inject;
-import javax.inject.Provider;
+import jakarta.inject.Inject;
+import com.google.inject.Provider;
import javax.net.ssl.SSLContext;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
diff --git a/jooby/src/main/java/org/jooby/internal/mvc/RequestParam.java b/jooby/src/main/java/org/jooby/internal/mvc/RequestParam.java
index 7ed6f3cb..d4ce8a87 100644
--- a/jooby/src/main/java/org/jooby/internal/mvc/RequestParam.java
+++ b/jooby/src/main/java/org/jooby/internal/mvc/RequestParam.java
@@ -34,7 +34,7 @@
import org.jooby.mvc.Header;
import org.jooby.mvc.Local;
-import javax.inject.Named;
+import jakarta.inject.Named;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Parameter;
import java.lang.reflect.Type;
diff --git a/jooby/src/main/java/org/jooby/internal/parser/LocalDateParser.java b/jooby/src/main/java/org/jooby/internal/parser/LocalDateParser.java
index 9df748df..2fc1ee48 100644
--- a/jooby/src/main/java/org/jooby/internal/parser/LocalDateParser.java
+++ b/jooby/src/main/java/org/jooby/internal/parser/LocalDateParser.java
@@ -24,7 +24,7 @@
import java.time.format.DateTimeFormatter;
import java.util.Optional;
-import javax.inject.Inject;
+import jakarta.inject.Inject;
import org.jooby.Parser;
diff --git a/jooby/src/main/java/org/jooby/internal/parser/ParserExecutor.java b/jooby/src/main/java/org/jooby/internal/parser/ParserExecutor.java
index 49cab5bf..3dd8811a 100644
--- a/jooby/src/main/java/org/jooby/internal/parser/ParserExecutor.java
+++ b/jooby/src/main/java/org/jooby/internal/parser/ParserExecutor.java
@@ -19,7 +19,7 @@
import java.util.Map;
import java.util.Set;
-import javax.inject.Inject;
+import jakarta.inject.Inject;
import org.jooby.MediaType;
import org.jooby.Mutant;
diff --git a/jooby/src/main/java/org/jooby/internal/parser/ZonedDateTimeParser.java b/jooby/src/main/java/org/jooby/internal/parser/ZonedDateTimeParser.java
index b6aa752f..4c743022 100644
--- a/jooby/src/main/java/org/jooby/internal/parser/ZonedDateTimeParser.java
+++ b/jooby/src/main/java/org/jooby/internal/parser/ZonedDateTimeParser.java
@@ -19,7 +19,7 @@
import static java.util.Objects.requireNonNull;
import org.jooby.Parser;
-import javax.inject.Inject;
+import jakarta.inject.Inject;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
diff --git a/jooby/src/main/java/org/jooby/internal/parser/bean/BeanPlan.java b/jooby/src/main/java/org/jooby/internal/parser/bean/BeanPlan.java
index 9e05d627..d9a9c0f2 100644
--- a/jooby/src/main/java/org/jooby/internal/parser/bean/BeanPlan.java
+++ b/jooby/src/main/java/org/jooby/internal/parser/bean/BeanPlan.java
@@ -27,7 +27,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.inject.Inject;
+import jakarta.inject.Inject;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
diff --git a/jooby/src/main/java/org/jooby/internal/ssl/SslContextProvider.java b/jooby/src/main/java/org/jooby/internal/ssl/SslContextProvider.java
index d7dda49f..efdac5ef 100644
--- a/jooby/src/main/java/org/jooby/internal/ssl/SslContextProvider.java
+++ b/jooby/src/main/java/org/jooby/internal/ssl/SslContextProvider.java
@@ -19,8 +19,8 @@
import static java.util.Objects.requireNonNull;
import org.jooby.funzy.Try;
-import javax.inject.Inject;
-import javax.inject.Provider;
+import jakarta.inject.Inject;
+import com.google.inject.Provider;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.FileNotFoundException;
diff --git a/jooby/src/main/java/org/jooby/jetty/Jetty.java b/jooby/src/main/java/org/jooby/jetty/Jetty.java
index d8b33174..0a5259fb 100644
--- a/jooby/src/main/java/org/jooby/jetty/Jetty.java
+++ b/jooby/src/main/java/org/jooby/jetty/Jetty.java
@@ -15,7 +15,7 @@
*/
package org.jooby.jetty;
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
import org.jooby.Env;
import org.jooby.Jooby;
diff --git a/jooby/src/main/java/org/jooby/json/Jackson.java b/jooby/src/main/java/org/jooby/json/Jackson.java
index 7a1cfc84..72de9073 100644
--- a/jooby/src/main/java/org/jooby/json/Jackson.java
+++ b/jooby/src/main/java/org/jooby/json/Jackson.java
@@ -33,7 +33,7 @@
import org.jooby.Parser;
import org.jooby.Renderer;
-import javax.inject.Inject;
+import jakarta.inject.Inject;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
diff --git a/jooby/src/main/java/org/jooby/mvc/Header.java b/jooby/src/main/java/org/jooby/mvc/Header.java
index 4b5e8885..11332062 100644
--- a/jooby/src/main/java/org/jooby/mvc/Header.java
+++ b/jooby/src/main/java/org/jooby/mvc/Header.java
@@ -20,7 +20,7 @@
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import javax.inject.Qualifier;
+import jakarta.inject.Qualifier;
/**
* Mark a MVC method parameter as a request header.
diff --git a/jooby/src/main/java/org/jooby/scope/Providers.java b/jooby/src/main/java/org/jooby/scope/Providers.java
index c9d97843..9dfe0e59 100644
--- a/jooby/src/main/java/org/jooby/scope/Providers.java
+++ b/jooby/src/main/java/org/jooby/scope/Providers.java
@@ -15,7 +15,7 @@
*/
package org.jooby.scope;
-import javax.inject.Provider;
+import com.google.inject.Provider;
import com.google.inject.Key;
import com.google.inject.OutOfScopeException;
diff --git a/jooby/src/main/java/org/jooby/scope/RequestScoped.java b/jooby/src/main/java/org/jooby/scope/RequestScoped.java
index 6a4533ea..60c1f271 100644
--- a/jooby/src/main/java/org/jooby/scope/RequestScoped.java
+++ b/jooby/src/main/java/org/jooby/scope/RequestScoped.java
@@ -20,7 +20,7 @@
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
-import javax.inject.Scope;
+import jakarta.inject.Scope;
/**
* Define a request scoped object. Steps for defining a request scoped object are:
diff --git a/jooby/src/test/java/org/jooby/JoobyTest.java b/jooby/src/test/java/org/jooby/JoobyTest.java
index 0b3123cd..22d7a445 100644
--- a/jooby/src/test/java/org/jooby/JoobyTest.java
+++ b/jooby/src/test/java/org/jooby/JoobyTest.java
@@ -90,8 +90,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.inject.Provider;
-import javax.inject.Singleton;
+import com.google.inject.Provider;
+import jakarta.inject.Singleton;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.nio.charset.Charset;
diff --git a/jooby/src/test/java/org/jooby/internal/jetty/JettyServerTest.java b/jooby/src/test/java/org/jooby/internal/jetty/JettyServerTest.java
index 5f6eeeaa..0ac3e376 100644
--- a/jooby/src/test/java/org/jooby/internal/jetty/JettyServerTest.java
+++ b/jooby/src/test/java/org/jooby/internal/jetty/JettyServerTest.java
@@ -29,7 +29,7 @@
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
-import javax.inject.Provider;
+import com.google.inject.Provider;
import javax.net.ssl.SSLContext;
import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
diff --git a/jooby/src/test/java/org/jooby/internal/mvc/RequestParamTest.java b/jooby/src/test/java/org/jooby/internal/mvc/RequestParamTest.java
index e0f24082..9a18ace1 100644
--- a/jooby/src/test/java/org/jooby/internal/mvc/RequestParamTest.java
+++ b/jooby/src/test/java/org/jooby/internal/mvc/RequestParamTest.java
@@ -23,7 +23,7 @@
import org.jooby.test.MockUnit;
import org.junit.Test;
-import javax.inject.Named;
+import jakarta.inject.Named;
import java.lang.reflect.Parameter;
import java.util.Optional;
diff --git a/jooby/src/test/java/org/jooby/internal/parser/BeanPlanTest.java b/jooby/src/test/java/org/jooby/internal/parser/BeanPlanTest.java
index cc7cd7e2..5fd8cf52 100644
--- a/jooby/src/test/java/org/jooby/internal/parser/BeanPlanTest.java
+++ b/jooby/src/test/java/org/jooby/internal/parser/BeanPlanTest.java
@@ -17,7 +17,7 @@
import static org.junit.Assert.assertEquals;
-import javax.inject.Inject;
+import jakarta.inject.Inject;
import org.jooby.internal.ParameterNameProvider;
import org.jooby.internal.parser.bean.BeanPlan;
diff --git a/metrics-api/pom.xml b/metrics-api/pom.xml
index 37702a02..ff1bf01b 100644
--- a/metrics-api/pom.xml
+++ b/metrics-api/pom.xml
@@ -27,5 +27,5 @@
spotbugs-exclude.xml
-
+
diff --git a/metrics/pom.xml b/metrics/pom.xml
index b7ccec45..9d207428 100644
--- a/metrics/pom.xml
+++ b/metrics/pom.xml
@@ -57,12 +57,12 @@
metrics-core
- jakarta.servlet
- jakarta.servlet-api
+ jakarta.inject
+ jakarta.inject-api
- javax.inject
- javax.inject
+ jakarta.servlet
+ jakarta.servlet-api
junit
diff --git a/metrics/src/main/java/org/killbill/commons/metrics/health/KillBillHealthCheckRegistry.java b/metrics/src/main/java/org/killbill/commons/metrics/health/KillBillHealthCheckRegistry.java
index 5a789307..74fe6031 100644
--- a/metrics/src/main/java/org/killbill/commons/metrics/health/KillBillHealthCheckRegistry.java
+++ b/metrics/src/main/java/org/killbill/commons/metrics/health/KillBillHealthCheckRegistry.java
@@ -24,7 +24,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import javax.inject.Inject;
+import jakarta.inject.Inject;
import org.killbill.commons.health.api.HealthCheck;
import org.killbill.commons.health.api.HealthCheckRegistry;
diff --git a/pom.xml b/pom.xml
index 30944dfe..750c6ccb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,9 +66,26 @@
true
+ 17
+ -Xmx${build.jvmsize} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED
+
+ com.google.inject
+ guice
+ 6.0.0
+
+
+ com.google.inject.extensions
+ guice-servlet
+ 6.0.0
+
+
+ jakarta.inject
+ jakarta.inject-api
+ 2.0.1
+
org.kill-bill.commons
killbill-automaton
diff --git a/queue/pom.xml b/queue/pom.xml
index 5a3e5677..de0c3eec 100644
--- a/queue/pom.xml
+++ b/queue/pom.xml
@@ -73,8 +73,8 @@
test
- javax.inject
- javax.inject
+ jakarta.inject
+ jakarta.inject-api
provided
diff --git a/queue/src/main/java/org/killbill/bus/DefaultPersistentBus.java b/queue/src/main/java/org/killbill/bus/DefaultPersistentBus.java
index c4b2e89b..e2cace83 100644
--- a/queue/src/main/java/org/killbill/bus/DefaultPersistentBus.java
+++ b/queue/src/main/java/org/killbill/bus/DefaultPersistentBus.java
@@ -31,8 +31,8 @@
import java.util.stream.Collectors;
import javax.annotation.Nullable;
-import javax.inject.Inject;
-import javax.inject.Named;
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
import javax.sql.DataSource;
import org.joda.time.DateTime;
diff --git a/queue/src/main/java/org/killbill/bus/InMemoryPersistentBus.java b/queue/src/main/java/org/killbill/bus/InMemoryPersistentBus.java
index 08b757c2..ecac067c 100644
--- a/queue/src/main/java/org/killbill/bus/InMemoryPersistentBus.java
+++ b/queue/src/main/java/org/killbill/bus/InMemoryPersistentBus.java
@@ -23,7 +23,7 @@
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
-import javax.inject.Inject;
+import jakarta.inject.Inject;
import org.joda.time.DateTime;
import org.killbill.bus.api.BusEvent;
diff --git a/queue/src/main/java/org/killbill/notificationq/DefaultNotificationQueueService.java b/queue/src/main/java/org/killbill/notificationq/DefaultNotificationQueueService.java
index a06af823..19c3b3be 100644
--- a/queue/src/main/java/org/killbill/notificationq/DefaultNotificationQueueService.java
+++ b/queue/src/main/java/org/killbill/notificationq/DefaultNotificationQueueService.java
@@ -22,8 +22,8 @@
import java.util.Map;
import java.util.Properties;
-import javax.inject.Inject;
-import javax.inject.Named;
+import jakarta.inject.Inject;
+import jakarta.inject.Named;
import javax.sql.DataSource;
import org.killbill.clock.Clock;
diff --git a/queue/src/test/java/org/killbill/notificationq/MockNotificationQueueService.java b/queue/src/test/java/org/killbill/notificationq/MockNotificationQueueService.java
index 2a6ea28b..c981d6ad 100644
--- a/queue/src/test/java/org/killbill/notificationq/MockNotificationQueueService.java
+++ b/queue/src/test/java/org/killbill/notificationq/MockNotificationQueueService.java
@@ -23,7 +23,7 @@
import java.util.ConcurrentModificationException;
import java.util.List;
-import javax.inject.Inject;
+import jakarta.inject.Inject;
import org.killbill.CreatorName;
import org.killbill.clock.Clock;
From b5d7a160dadbbeefddcae87b083587a4906fa7ad Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Thu, 9 Apr 2026 03:56:21 +0700
Subject: [PATCH 03/15] jooby: migrate to jakarta.xml
---
automaton/pom.xml | 3 +++
.../killbill/automaton/DefaultLinkStateMachine.java | 8 ++++----
.../org/killbill/automaton/DefaultOperation.java | 8 ++++----
.../java/org/killbill/automaton/DefaultState.java | 8 ++++----
.../org/killbill/automaton/DefaultStateMachine.java | 12 ++++++------
.../automaton/DefaultStateMachineConfig.java | 10 +++++-----
.../org/killbill/automaton/DefaultTransition.java | 8 ++++----
.../automaton/StateMachineValidatingConfig.java | 4 ++--
xmlloader/pom.xml | 3 +++
.../org/killbill/xmlloader/ValidatingConfig.java | 4 ++--
.../main/java/org/killbill/xmlloader/XMLLoader.java | 6 +++---
.../org/killbill/xmlloader/XMLSchemaGenerator.java | 6 +++---
.../main/java/org/killbill/xmlloader/XMLWriter.java | 4 ++--
.../java/org/killbill/xmlloader/TestXMLLoader.java | 2 +-
.../killbill/xmlloader/TestXMLSchemaGenerator.java | 2 +-
.../java/org/killbill/xmlloader/XmlTestClass.java | 6 +++---
16 files changed, 50 insertions(+), 44 deletions(-)
diff --git a/automaton/pom.xml b/automaton/pom.xml
index 06aed9f2..c22ed36f 100644
--- a/automaton/pom.xml
+++ b/automaton/pom.xml
@@ -38,11 +38,13 @@
jakarta.activation
jakarta.activation-api
+ 2.1.0
runtime
jakarta.xml.bind
jakarta.xml.bind-api
+ 4.0.0
org.awaitility
@@ -52,6 +54,7 @@
org.glassfish.jaxb
jaxb-runtime
+ 4.0.0
runtime
diff --git a/automaton/src/main/java/org/killbill/automaton/DefaultLinkStateMachine.java b/automaton/src/main/java/org/killbill/automaton/DefaultLinkStateMachine.java
index 71dcf6d7..200e4a3a 100644
--- a/automaton/src/main/java/org/killbill/automaton/DefaultLinkStateMachine.java
+++ b/automaton/src/main/java/org/killbill/automaton/DefaultLinkStateMachine.java
@@ -24,10 +24,10 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlIDREF;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlIDREF;
import org.killbill.xmlloader.ValidationErrors;
diff --git a/automaton/src/main/java/org/killbill/automaton/DefaultOperation.java b/automaton/src/main/java/org/killbill/automaton/DefaultOperation.java
index 6a75583a..2a27b4aa 100644
--- a/automaton/src/main/java/org/killbill/automaton/DefaultOperation.java
+++ b/automaton/src/main/java/org/killbill/automaton/DefaultOperation.java
@@ -24,10 +24,10 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlID;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlAttribute;
+import jakarta.xml.bind.annotation.XmlID;
import org.killbill.xmlloader.ValidationErrors;
diff --git a/automaton/src/main/java/org/killbill/automaton/DefaultState.java b/automaton/src/main/java/org/killbill/automaton/DefaultState.java
index bcdcff56..73d45052 100644
--- a/automaton/src/main/java/org/killbill/automaton/DefaultState.java
+++ b/automaton/src/main/java/org/killbill/automaton/DefaultState.java
@@ -24,10 +24,10 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlID;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlAttribute;
+import jakarta.xml.bind.annotation.XmlID;
import org.killbill.xmlloader.ValidationErrors;
diff --git a/automaton/src/main/java/org/killbill/automaton/DefaultStateMachine.java b/automaton/src/main/java/org/killbill/automaton/DefaultStateMachine.java
index ad49451b..dfc505e7 100644
--- a/automaton/src/main/java/org/killbill/automaton/DefaultStateMachine.java
+++ b/automaton/src/main/java/org/killbill/automaton/DefaultStateMachine.java
@@ -27,12 +27,12 @@
import java.util.NoSuchElementException;
import java.util.stream.Stream;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlID;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlAttribute;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlElementWrapper;
+import jakarta.xml.bind.annotation.XmlID;
import org.killbill.xmlloader.ValidationErrors;
diff --git a/automaton/src/main/java/org/killbill/automaton/DefaultStateMachineConfig.java b/automaton/src/main/java/org/killbill/automaton/DefaultStateMachineConfig.java
index f09ac756..fea9242f 100644
--- a/automaton/src/main/java/org/killbill/automaton/DefaultStateMachineConfig.java
+++ b/automaton/src/main/java/org/killbill/automaton/DefaultStateMachineConfig.java
@@ -27,11 +27,11 @@
import java.util.NoSuchElementException;
import java.util.stream.Stream;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlElementWrapper;
+import jakarta.xml.bind.annotation.XmlRootElement;
import org.killbill.xmlloader.ValidationErrors;
diff --git a/automaton/src/main/java/org/killbill/automaton/DefaultTransition.java b/automaton/src/main/java/org/killbill/automaton/DefaultTransition.java
index 4bc76a90..071da64c 100644
--- a/automaton/src/main/java/org/killbill/automaton/DefaultTransition.java
+++ b/automaton/src/main/java/org/killbill/automaton/DefaultTransition.java
@@ -24,10 +24,10 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlIDREF;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlIDREF;
import org.killbill.xmlloader.ValidationErrors;
diff --git a/automaton/src/main/java/org/killbill/automaton/StateMachineValidatingConfig.java b/automaton/src/main/java/org/killbill/automaton/StateMachineValidatingConfig.java
index 84473e51..f9719593 100644
--- a/automaton/src/main/java/org/killbill/automaton/StateMachineValidatingConfig.java
+++ b/automaton/src/main/java/org/killbill/automaton/StateMachineValidatingConfig.java
@@ -21,8 +21,8 @@
import org.killbill.xmlloader.ValidatingConfig;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.NONE)
public abstract class StateMachineValidatingConfig extends ValidatingConfig {
diff --git a/xmlloader/pom.xml b/xmlloader/pom.xml
index 6ea7562a..ed73f6cc 100644
--- a/xmlloader/pom.xml
+++ b/xmlloader/pom.xml
@@ -39,11 +39,13 @@
jakarta.activation
jakarta.activation-api
+ 2.1.0
runtime
jakarta.xml.bind
jakarta.xml.bind-api
+ 4.0.0
org.awaitility
@@ -53,6 +55,7 @@
org.glassfish.jaxb
jaxb-runtime
+ 4.0.0
runtime
diff --git a/xmlloader/src/main/java/org/killbill/xmlloader/ValidatingConfig.java b/xmlloader/src/main/java/org/killbill/xmlloader/ValidatingConfig.java
index d91243ca..699e37bf 100644
--- a/xmlloader/src/main/java/org/killbill/xmlloader/ValidatingConfig.java
+++ b/xmlloader/src/main/java/org/killbill/xmlloader/ValidatingConfig.java
@@ -19,8 +19,8 @@
package org.killbill.xmlloader;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.NONE)
public abstract class ValidatingConfig {
diff --git a/xmlloader/src/main/java/org/killbill/xmlloader/XMLLoader.java b/xmlloader/src/main/java/org/killbill/xmlloader/XMLLoader.java
index 652b7284..a7201926 100644
--- a/xmlloader/src/main/java/org/killbill/xmlloader/XMLLoader.java
+++ b/xmlloader/src/main/java/org/killbill/xmlloader/XMLLoader.java
@@ -24,9 +24,9 @@
import java.net.URI;
import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.JAXBException;
+import jakarta.xml.bind.Unmarshaller;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
diff --git a/xmlloader/src/main/java/org/killbill/xmlloader/XMLSchemaGenerator.java b/xmlloader/src/main/java/org/killbill/xmlloader/XMLSchemaGenerator.java
index cd223529..2986918b 100644
--- a/xmlloader/src/main/java/org/killbill/xmlloader/XMLSchemaGenerator.java
+++ b/xmlloader/src/main/java/org/killbill/xmlloader/XMLSchemaGenerator.java
@@ -29,9 +29,9 @@
import java.util.ArrayList;
import java.util.List;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.SchemaOutputResolver;
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.JAXBException;
+import jakarta.xml.bind.SchemaOutputResolver;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
diff --git a/xmlloader/src/main/java/org/killbill/xmlloader/XMLWriter.java b/xmlloader/src/main/java/org/killbill/xmlloader/XMLWriter.java
index 888aaed2..5dcdace5 100644
--- a/xmlloader/src/main/java/org/killbill/xmlloader/XMLWriter.java
+++ b/xmlloader/src/main/java/org/killbill/xmlloader/XMLWriter.java
@@ -21,8 +21,8 @@
import java.io.ByteArrayOutputStream;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Marshaller;
+import jakarta.xml.bind.JAXBContext;
+import jakarta.xml.bind.Marshaller;
import static java.nio.charset.StandardCharsets.UTF_8;
diff --git a/xmlloader/src/test/java/org/killbill/xmlloader/TestXMLLoader.java b/xmlloader/src/test/java/org/killbill/xmlloader/TestXMLLoader.java
index 4c7d7efd..dfc6ab30 100644
--- a/xmlloader/src/test/java/org/killbill/xmlloader/TestXMLLoader.java
+++ b/xmlloader/src/test/java/org/killbill/xmlloader/TestXMLLoader.java
@@ -23,7 +23,7 @@
import java.io.IOException;
import java.io.InputStream;
-import javax.xml.bind.JAXBException;
+import jakarta.xml.bind.JAXBException;
import javax.xml.transform.TransformerException;
import org.testng.annotations.Test;
diff --git a/xmlloader/src/test/java/org/killbill/xmlloader/TestXMLSchemaGenerator.java b/xmlloader/src/test/java/org/killbill/xmlloader/TestXMLSchemaGenerator.java
index 14eb783b..8645d328 100644
--- a/xmlloader/src/test/java/org/killbill/xmlloader/TestXMLSchemaGenerator.java
+++ b/xmlloader/src/test/java/org/killbill/xmlloader/TestXMLSchemaGenerator.java
@@ -23,7 +23,7 @@
import java.io.InputStream;
import java.io.InputStreamReader;
-import javax.xml.bind.JAXBException;
+import jakarta.xml.bind.JAXBException;
import javax.xml.transform.TransformerException;
import org.killbill.commons.utils.io.CharStreams;
diff --git a/xmlloader/src/test/java/org/killbill/xmlloader/XmlTestClass.java b/xmlloader/src/test/java/org/killbill/xmlloader/XmlTestClass.java
index 4f78f263..cde28f1c 100644
--- a/xmlloader/src/test/java/org/killbill/xmlloader/XmlTestClass.java
+++ b/xmlloader/src/test/java/org/killbill/xmlloader/XmlTestClass.java
@@ -19,9 +19,9 @@
package org.killbill.xmlloader;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
From 46acf4dcf9ca4a511598831b0e52a0230d140d46 Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Fri, 10 Apr 2026 04:18:53 +0700
Subject: [PATCH 04/15] jooby: migrate jooby module servlet from javax to
jakarta namespace
---
jooby/pom.xml | 16 ++++++++++++++--
.../org/jooby/internal/jetty/JettyHandler.java | 8 ++++----
.../org/jooby/internal/jetty/JettyResponse.java | 4 ++--
.../java/org/jooby/internal/jetty/JettySse.java | 2 +-
.../org/jooby/servlet/ServerInitializer.java | 6 +++---
.../java/org/jooby/servlet/ServletHandler.java | 12 ++++++------
.../org/jooby/servlet/ServletServletRequest.java | 6 +++---
.../jooby/servlet/ServletServletResponse.java | 8 ++++----
.../java/org/jooby/servlet/ServletUpload.java | 2 +-
.../jooby/internal/jetty/JettyHandlerTest.java | 6 +++---
.../jooby/internal/jetty/JettyResponseTest.java | 4 ++--
.../org/jooby/internal/jetty/JettySseTest.java | 2 +-
.../org/jooby/servlet/ServerInitializerTest.java | 4 ++--
.../org/jooby/servlet/ServletHandlerTest.java | 10 +++++-----
.../jooby/servlet/ServletServletRequestTest.java | 4 ++--
.../servlet/ServletServletResponseTest.java | 6 +++---
16 files changed, 56 insertions(+), 44 deletions(-)
diff --git a/jooby/pom.xml b/jooby/pom.xml
index 8f747ad1..3ccc1f52 100644
--- a/jooby/pom.xml
+++ b/jooby/pom.xml
@@ -28,6 +28,8 @@
Fork of Jooby 1.6.9 (core, servlet, jetty, jackson, funzy)
spotbugs-exclude.xml
+ 11.0.24
+ 5.0.0
@@ -63,16 +65,26 @@
9.7
true
-
+
jakarta.servlet
jakarta.servlet-api
+ ${jakarta.servlet.version}
-
+
org.eclipse.jetty
jetty-server
+ ${jetty.version}
+
+
+
+ org.eclipse.jetty.toolchain
+ jetty-jakarta-servlet-api
+
+
diff --git a/jooby/src/main/java/org/jooby/internal/jetty/JettyHandler.java b/jooby/src/main/java/org/jooby/internal/jetty/JettyHandler.java
index f7c87083..642215df 100644
--- a/jooby/src/main/java/org/jooby/internal/jetty/JettyHandler.java
+++ b/jooby/src/main/java/org/jooby/internal/jetty/JettyHandler.java
@@ -17,10 +17,10 @@
import java.io.IOException;
-import javax.servlet.MultipartConfigElement;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.MultipartConfigElement;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
diff --git a/jooby/src/main/java/org/jooby/internal/jetty/JettyResponse.java b/jooby/src/main/java/org/jooby/internal/jetty/JettyResponse.java
index d979ed92..23ba0c5f 100644
--- a/jooby/src/main/java/org/jooby/internal/jetty/JettyResponse.java
+++ b/jooby/src/main/java/org/jooby/internal/jetty/JettyResponse.java
@@ -21,8 +21,8 @@
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.HttpOutput;
import org.eclipse.jetty.server.Response;
diff --git a/jooby/src/main/java/org/jooby/internal/jetty/JettySse.java b/jooby/src/main/java/org/jooby/internal/jetty/JettySse.java
index 97b73f5b..e66b69eb 100644
--- a/jooby/src/main/java/org/jooby/internal/jetty/JettySse.java
+++ b/jooby/src/main/java/org/jooby/internal/jetty/JettySse.java
@@ -24,7 +24,7 @@
import org.jooby.Sse;
import org.jooby.funzy.Try;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
diff --git a/jooby/src/main/java/org/jooby/servlet/ServerInitializer.java b/jooby/src/main/java/org/jooby/servlet/ServerInitializer.java
index 45f38eb6..2e7b9ea0 100644
--- a/jooby/src/main/java/org/jooby/servlet/ServerInitializer.java
+++ b/jooby/src/main/java/org/jooby/servlet/ServerInitializer.java
@@ -23,9 +23,9 @@
import org.jooby.funzy.Throwing;
import org.jooby.spi.Server;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextListener;
public class ServerInitializer implements ServletContextListener {
diff --git a/jooby/src/main/java/org/jooby/servlet/ServletHandler.java b/jooby/src/main/java/org/jooby/servlet/ServletHandler.java
index 601e1e3f..179c7d86 100644
--- a/jooby/src/main/java/org/jooby/servlet/ServletHandler.java
+++ b/jooby/src/main/java/org/jooby/servlet/ServletHandler.java
@@ -17,12 +17,12 @@
import java.io.IOException;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.jooby.Jooby;
import org.jooby.spi.HttpHandler;
diff --git a/jooby/src/main/java/org/jooby/servlet/ServletServletRequest.java b/jooby/src/main/java/org/jooby/servlet/ServletServletRequest.java
index 351ef0c2..ca75d8a2 100644
--- a/jooby/src/main/java/org/jooby/servlet/ServletServletRequest.java
+++ b/jooby/src/main/java/org/jooby/servlet/ServletServletRequest.java
@@ -30,8 +30,8 @@
import java.util.function.Function;
import java.util.stream.Collectors;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
import org.jooby.Cookie;
import org.jooby.MediaType;
@@ -150,7 +150,7 @@ public List headerNames() {
@Override
public List cookies() {
- javax.servlet.http.Cookie[] cookies = req.getCookies();
+ jakarta.servlet.http.Cookie[] cookies = req.getCookies();
if (cookies == null) {
return ImmutableList.of();
}
diff --git a/jooby/src/main/java/org/jooby/servlet/ServletServletResponse.java b/jooby/src/main/java/org/jooby/servlet/ServletServletResponse.java
index 74a7fcc6..7abb8877 100644
--- a/jooby/src/main/java/org/jooby/servlet/ServletServletResponse.java
+++ b/jooby/src/main/java/org/jooby/servlet/ServletServletResponse.java
@@ -22,10 +22,10 @@
import org.jooby.funzy.Try;
import org.jooby.spi.NativeResponse;
-import javax.servlet.AsyncContext;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.AsyncContext;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
diff --git a/jooby/src/main/java/org/jooby/servlet/ServletUpload.java b/jooby/src/main/java/org/jooby/servlet/ServletUpload.java
index 8102674b..8f3c0c2d 100644
--- a/jooby/src/main/java/org/jooby/servlet/ServletUpload.java
+++ b/jooby/src/main/java/org/jooby/servlet/ServletUpload.java
@@ -23,7 +23,7 @@
import java.util.Collections;
import java.util.List;
-import javax.servlet.http.Part;
+import jakarta.servlet.http.Part;
import org.jooby.spi.NativeUpload;
diff --git a/jooby/src/test/java/org/jooby/internal/jetty/JettyHandlerTest.java b/jooby/src/test/java/org/jooby/internal/jetty/JettyHandlerTest.java
index 5011e3bb..ed56a1d8 100644
--- a/jooby/src/test/java/org/jooby/internal/jetty/JettyHandlerTest.java
+++ b/jooby/src/test/java/org/jooby/internal/jetty/JettyHandlerTest.java
@@ -26,9 +26,9 @@
import java.io.IOException;
import java.util.concurrent.atomic.AtomicReference;
-import javax.servlet.MultipartConfigElement;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.MultipartConfigElement;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
diff --git a/jooby/src/test/java/org/jooby/internal/jetty/JettyResponseTest.java b/jooby/src/test/java/org/jooby/internal/jetty/JettyResponseTest.java
index 76a6994a..3e13764e 100644
--- a/jooby/src/test/java/org/jooby/internal/jetty/JettyResponseTest.java
+++ b/jooby/src/test/java/org/jooby/internal/jetty/JettyResponseTest.java
@@ -32,8 +32,8 @@
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
-import javax.servlet.AsyncContext;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.AsyncContext;
+import jakarta.servlet.http.HttpServletRequest;
import org.eclipse.jetty.server.HttpOutput;
import org.eclipse.jetty.server.Request;
diff --git a/jooby/src/test/java/org/jooby/internal/jetty/JettySseTest.java b/jooby/src/test/java/org/jooby/internal/jetty/JettySseTest.java
index 69b42e51..30c66d26 100644
--- a/jooby/src/test/java/org/jooby/internal/jetty/JettySseTest.java
+++ b/jooby/src/test/java/org/jooby/internal/jetty/JettySseTest.java
@@ -28,7 +28,7 @@
import static org.junit.Assert.assertEquals;
import org.junit.Test;
-import javax.servlet.AsyncContext;
+import jakarta.servlet.AsyncContext;
import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.CountDownLatch;
diff --git a/jooby/src/test/java/org/jooby/servlet/ServerInitializerTest.java b/jooby/src/test/java/org/jooby/servlet/ServerInitializerTest.java
index be875c05..6b009133 100644
--- a/jooby/src/test/java/org/jooby/servlet/ServerInitializerTest.java
+++ b/jooby/src/test/java/org/jooby/servlet/ServerInitializerTest.java
@@ -22,8 +22,8 @@
import org.jooby.test.MockUnit;
import org.junit.Test;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletContextEvent;
public class ServerInitializerTest {
diff --git a/jooby/src/test/java/org/jooby/servlet/ServletHandlerTest.java b/jooby/src/test/java/org/jooby/servlet/ServletHandlerTest.java
index 5cc0655c..c87895df 100644
--- a/jooby/src/test/java/org/jooby/servlet/ServletHandlerTest.java
+++ b/jooby/src/test/java/org/jooby/servlet/ServletHandlerTest.java
@@ -19,11 +19,11 @@
import java.io.IOException;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.jooby.Jooby;
import org.jooby.spi.HttpHandler;
diff --git a/jooby/src/test/java/org/jooby/servlet/ServletServletRequestTest.java b/jooby/src/test/java/org/jooby/servlet/ServletServletRequestTest.java
index 396dfa20..2aecca0e 100644
--- a/jooby/src/test/java/org/jooby/servlet/ServletServletRequestTest.java
+++ b/jooby/src/test/java/org/jooby/servlet/ServletServletRequestTest.java
@@ -22,8 +22,8 @@
import java.util.Collections;
import java.util.UUID;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
import org.jooby.MediaType;
import org.jooby.test.MockUnit;
diff --git a/jooby/src/test/java/org/jooby/servlet/ServletServletResponseTest.java b/jooby/src/test/java/org/jooby/servlet/ServletServletResponseTest.java
index 3da62e44..4572b84e 100644
--- a/jooby/src/test/java/org/jooby/servlet/ServletServletResponseTest.java
+++ b/jooby/src/test/java/org/jooby/servlet/ServletServletResponseTest.java
@@ -22,9 +22,9 @@
import static org.junit.Assert.assertEquals;
import org.junit.Test;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
From 9de620ad25033c4dce0f4a3304fbdf9fc6a6da37 Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 00:39:39 +0700
Subject: [PATCH 05/15] jooby: migrate jooby module jsr305 from javax to
jakarta namespace
---
jooby/CHANGES.md | 44 +++++++++++++++----
jooby/pom.xml | 15 +------
jooby/src/main/java/org/jooby/Asset.java | 2 +-
jooby/src/main/java/org/jooby/Cookie.java | 4 +-
jooby/src/main/java/org/jooby/Deferred.java | 4 +-
jooby/src/main/java/org/jooby/Env.java | 4 +-
jooby/src/main/java/org/jooby/Err.java | 2 +-
jooby/src/main/java/org/jooby/Jooby.java | 4 +-
jooby/src/main/java/org/jooby/LifeCycle.java | 6 +--
jooby/src/main/java/org/jooby/Mutant.java | 2 +-
jooby/src/main/java/org/jooby/Registry.java | 2 +-
jooby/src/main/java/org/jooby/Request.java | 4 +-
jooby/src/main/java/org/jooby/Response.java | 4 +-
jooby/src/main/java/org/jooby/Result.java | 4 +-
jooby/src/main/java/org/jooby/Results.java | 2 +-
jooby/src/main/java/org/jooby/Route.java | 5 +--
jooby/src/main/java/org/jooby/Router.java | 2 +-
jooby/src/main/java/org/jooby/Session.java | 2 +-
jooby/src/main/java/org/jooby/Sse.java | 2 +-
jooby/src/main/java/org/jooby/Upload.java | 2 +-
jooby/src/main/java/org/jooby/View.java | 2 +-
jooby/src/main/java/org/jooby/WebSocket.java | 4 +-
.../org/jooby/internal/WebSocketImpl.java | 2 +-
.../internal/parser/bean/BeanIndexedPath.java | 2 +-
.../src/main/java/org/jooby/package-info.java | 1 -
jooby/src/test/java/org/jooby/EnvTest.java | 2 +-
.../test/java/org/jooby/LifeCycleTest.java | 4 +-
.../src/test/java/org/jooby/RequestTest.java | 2 +-
.../test/java/org/jooby/WebSocketTest.java | 2 +-
29 files changed, 75 insertions(+), 62 deletions(-)
diff --git a/jooby/CHANGES.md b/jooby/CHANGES.md
index c6f18474..22db8bc3 100644
--- a/jooby/CHANGES.md
+++ b/jooby/CHANGES.md
@@ -30,6 +30,34 @@ The following files were modified from upstream to adapt to Jetty 10 API changes
| `RoutePattern.java` | Simplified the glob-route regex to remove nested ambiguous quantifiers | Fixes CodeQL ReDoS warning without changing route-matching semantics |
| `PemReader.java` | Simplified PEM block regex whitespace handling from redundant alternation to `\\s+` | Fixes CodeQL ReDoS warning while keeping the same accepted PEM formats |
+### Kill Bill fork maintenance — Jetty 11 / Jakarta servlet migration
+
+The following files were modified from the Kill Bill Jetty 10 baseline to migrate the fork to
+Jetty 11 / Servlet 5 (`jakarta.servlet` namespace):
+
+| File | Change | Reason |
+|---|---|---|
+| `pom.xml` | Added local `jetty.version=11.0.24` and `jakarta.servlet.version=5.0.0`; updated `jetty-server` and `jakarta.servlet-api`; excluded `org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api` from `jetty-server` | Jetty 11 is the latest `11.0.x` patch line compatible with the repository's managed `slf4j-api:2.0.9`; the exclusion avoids duplicate Servlet 5 classes on the test classpath |
+| `src/main/java/org/jooby/internal/jetty/JettyHandler.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Jetty 11 uses Servlet 5 / Jakarta namespace only |
+| `src/main/java/org/jooby/internal/jetty/JettyResponse.java` | Replaced `javax.servlet.http.*` imports with `jakarta.servlet.http.*` | Jetty 11 uses Servlet 5 / Jakarta namespace only |
+| `src/main/java/org/jooby/internal/jetty/JettySse.java` | Replaced `javax.servlet.http.HttpServletResponse` with `jakarta.servlet.http.HttpServletResponse` | Jetty 11 uses Servlet 5 / Jakarta namespace only |
+| `src/main/java/org/jooby/servlet/ServerInitializer.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Servlet adapter now compiles against Servlet 5 |
+| `src/main/java/org/jooby/servlet/ServletHandler.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Servlet adapter now compiles against Servlet 5 |
+| `src/main/java/org/jooby/servlet/ServletServletRequest.java` | Replaced `javax.servlet.*` imports/usages, including fully-qualified `Cookie` reference | Servlet adapter now compiles against Servlet 5 |
+| `src/main/java/org/jooby/servlet/ServletServletResponse.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Servlet adapter now compiles against Servlet 5 |
+| `src/main/java/org/jooby/servlet/ServletUpload.java` | Replaced `javax.servlet.http.Part` with `jakarta.servlet.http.Part` | Servlet adapter now compiles against Servlet 5 |
+| `src/test/java/org/jooby/internal/jetty/JettyHandlerTest.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Align Jetty adapter tests with Servlet 5 |
+| `src/test/java/org/jooby/internal/jetty/JettyResponseTest.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Align Jetty adapter tests with Servlet 5 |
+| `src/test/java/org/jooby/internal/jetty/JettySseTest.java` | Replaced `javax.servlet.AsyncContext` with `jakarta.servlet.AsyncContext` | Align Jetty adapter tests with Servlet 5 |
+| `src/test/java/org/jooby/servlet/ServerInitializerTest.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Align servlet adapter tests with Servlet 5 |
+| `src/test/java/org/jooby/servlet/ServletHandlerTest.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Align servlet adapter tests with Servlet 5 |
+| `src/test/java/org/jooby/servlet/ServletServletRequestTest.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Align servlet adapter tests with Servlet 5 |
+| `src/test/java/org/jooby/servlet/ServletServletResponseTest.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Align servlet adapter tests with Servlet 5 |
+
+Jooby API signatures and lifecycle hooks now import `jakarta.annotation.*` directly. The old
+package-level `@ParametersAreNonnullByDefault` marker was removed because the Jakarta annotation
+API does not provide an equivalent package-default annotation.
+
## POM / Dependency Changes
The `jooby/pom.xml` is written from scratch (not a copy of any upstream POM). It merges
@@ -43,22 +71,22 @@ Differences from upstream dependency versions:
| `com.google.inject:guice` | 4.2.0 | 5.1.0 (managed by killbill-oss-parent) | Kill Bill standardized version |
| `com.google.inject.extensions:guice-multibindings` | 4.2.0 | **removed** | `Multibinder` merged into core Guice since 4.2 |
| `org.jooby:funzy` | 0.1.0 (external dep) | **removed** (source inlined) | 3 classes copied into `org.jooby.funzy` package |
-| `org.eclipse.jetty:jetty-server` | 9.4.24.v20191120 | 10.0.16 (managed) | Kill Bill standardized version |
-| `org.eclipse.jetty.http2:http2-server` | 9.4.24.v20191120 | 10.0.16 | Aligned with jetty-server |
+| `org.eclipse.jetty:jetty-server` | 9.4.24.v20191120 | 11.0.24 | Jetty 11 is the newest `11.0.x` line compatible with the repository-managed `slf4j-api:2.0.9`; local exclusion avoids duplicate Servlet API classes |
+| `org.eclipse.jetty.http2:http2-server` | 9.4.24.v20191120 | 11.0.24 | Aligned with jetty-server |
| `org.eclipse.jetty.websocket:websocket-server` | 9.4.24.v20191120 | **removed** | WebSocket factory code removed from Jetty adapter; `websocket-jetty-api` added separately |
| `org.eclipse.jetty:jetty-alpn-openjdk8-server` | 9.4.24.v20191120 | **removed** | Not available in Jetty 10; ALPN is built-in |
-| `javax.servlet:javax.servlet-api` | 3.1.0 | `jakarta.servlet:jakarta.servlet-api` 4.0.4 | Kill Bill transitional artifact (still ships `javax.servlet` packages) |
+| `javax.servlet:javax.servlet-api` | 3.1.0 | `jakarta.servlet:jakarta.servlet-api` 5.0.0 | True Jakarta Servlet 5 API for Jetty 11 / `jakarta.servlet.*` sources |
| `org.ow2.asm:asm` | 7.3.1 | 9.7 | Updated for JDK 11+ compatibility |
| `com.google.guava:guava` | 25.1-jre | 31.1-jre (managed) | Kill Bill standardized version |
| `com.typesafe:config` | 1.3.3 | 1.4.2 (managed) | Kill Bill standardized version |
| `org.slf4j:slf4j-api` | 1.7.x | 2.0.9 (managed) | Kill Bill standardized version |
| `org.powermock:powermock-*` | 2.0.0 | **removed** | Not managed by killbill-oss-parent; obsolete for modern JDKs |
-| `jakarta.annotation:jakarta.annotation-api` | not present | 1.3.5 (managed) | Added for `@PostConstruct`/`@PreDestroy` in `LifeCycle.java` |
+| `jakarta.annotation:jakarta.annotation-api` | not present | 2.1.1 (managed) | Used directly for `@PostConstruct`/`@PreDestroy` and nullability annotations after removing Jooby's direct `javax.annotation` usage |
| `com.github.spotbugs:spotbugs-annotations` | not present | **not included** | Not needed; no forked source uses `@SuppressFBWarnings`, and SpotBugs triage uses the exclusion filter instead |
-| `org.eclipse.jetty:jetty-alpn-server` | not present | 10.0.16 | Required by `JettyServer.java` for ALPN/HTTP2 support |
-| `org.eclipse.jetty.websocket:websocket-jetty-api` | not present (was part of websocket-server) | 10.0.16 | Jetty 10 split WebSocket API into separate artifact |
-| `org.eclipse.jetty:jetty-io` | transitive | 10.0.16 (explicit) | Used directly in source; declared explicitly to satisfy dependency:analyze |
-| `org.eclipse.jetty:jetty-util` | transitive | 10.0.16 (explicit) | Used directly in source; declared explicitly to satisfy dependency:analyze |
+| `org.eclipse.jetty:jetty-alpn-server` | not present | 11.0.24 | Required by `JettyServer.java` for ALPN/HTTP2 support |
+| `org.eclipse.jetty.websocket:websocket-jetty-api` | not present (was part of websocket-server) | 11.0.24 | Jetty 10/11 split WebSocket API into separate artifact |
+| `org.eclipse.jetty:jetty-io` | transitive | 11.0.24 (explicit) | Used directly in source; declared explicitly to satisfy dependency:analyze |
+| `org.eclipse.jetty:jetty-util` | transitive | 11.0.24 (explicit) | Used directly in source; declared explicitly to satisfy dependency:analyze |
| `jakarta.inject:jakarta.inject-api` | transitive via Guice | 2.0.1 (managed in root pom, explicit in fork) | Used directly for injection annotations; provider-facing Guice bindings still use `com.google.inject.Provider` where required |
| `junit:junit` | optional (compile) | compile + optional | Parent forces test scope; explicit compile needed for `JoobyRule` |
| `org.mockito:mockito-core` | not present | 5.3.1 (managed, test) | Sole active mocking framework for the migrated test tree |
diff --git a/jooby/pom.xml b/jooby/pom.xml
index 3ccc1f52..16a6385d 100644
--- a/jooby/pom.xml
+++ b/jooby/pom.xml
@@ -28,8 +28,6 @@
Fork of Jooby 1.6.9 (core, servlet, jetty, jackson, funzy)
spotbugs-exclude.xml
- 11.0.24
- 5.0.0
@@ -49,11 +47,7 @@
org.slf4j
slf4j-api
-
- com.google.code.findbugs
- jsr305
-
-
+
jakarta.annotation
jakarta.annotation-api
@@ -69,14 +63,12 @@
jakarta.servlet
jakarta.servlet-api
- ${jakarta.servlet.version}
org.eclipse.jetty
jetty-server
- ${jetty.version}
@@ -90,30 +82,25 @@
org.eclipse.jetty.http2
http2-server
- ${jetty.version}
org.eclipse.jetty
jetty-alpn-server
- ${jetty.version}
org.eclipse.jetty.websocket
websocket-jetty-api
- ${jetty.version}
org.eclipse.jetty
jetty-io
- ${jetty.version}
org.eclipse.jetty
jetty-util
- ${jetty.version}
diff --git a/jooby/src/main/java/org/jooby/Asset.java b/jooby/src/main/java/org/jooby/Asset.java
index a23447e2..8f8465b6 100644
--- a/jooby/src/main/java/org/jooby/Asset.java
+++ b/jooby/src/main/java/org/jooby/Asset.java
@@ -25,7 +25,7 @@
import com.google.common.primitives.Longs;
import org.jooby.funzy.Throwing;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
/**
* Usually a public file/resource like javascript, css, images files, etc...
diff --git a/jooby/src/main/java/org/jooby/Cookie.java b/jooby/src/main/java/org/jooby/Cookie.java
index d29179d2..36cfa0c7 100644
--- a/jooby/src/main/java/org/jooby/Cookie.java
+++ b/jooby/src/main/java/org/jooby/Cookie.java
@@ -22,8 +22,8 @@
import org.jooby.funzy.Throwing;
import org.jooby.internal.CookieImpl;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLDecoder;
diff --git a/jooby/src/main/java/org/jooby/Deferred.java b/jooby/src/main/java/org/jooby/Deferred.java
index 0a505881..d80819cc 100644
--- a/jooby/src/main/java/org/jooby/Deferred.java
+++ b/jooby/src/main/java/org/jooby/Deferred.java
@@ -17,8 +17,8 @@
import static java.util.Objects.requireNonNull;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
import java.util.Optional;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
diff --git a/jooby/src/main/java/org/jooby/Env.java b/jooby/src/main/java/org/jooby/Env.java
index 502029d7..432f3d70 100644
--- a/jooby/src/main/java/org/jooby/Env.java
+++ b/jooby/src/main/java/org/jooby/Env.java
@@ -23,8 +23,8 @@
import static java.util.Objects.requireNonNull;
import org.jooby.funzy.Throwing;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
diff --git a/jooby/src/main/java/org/jooby/Err.java b/jooby/src/main/java/org/jooby/Err.java
index ab25c6e6..9640bb0e 100644
--- a/jooby/src/main/java/org/jooby/Err.java
+++ b/jooby/src/main/java/org/jooby/Err.java
@@ -27,7 +27,7 @@
import com.google.common.base.Throwables;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nullable;
/**
* An exception that carry a {@link Status}. The status field will be set in the HTTP
diff --git a/jooby/src/main/java/org/jooby/Jooby.java b/jooby/src/main/java/org/jooby/Jooby.java
index a4e8ffa5..aeb0ad1e 100644
--- a/jooby/src/main/java/org/jooby/Jooby.java
+++ b/jooby/src/main/java/org/jooby/Jooby.java
@@ -99,8 +99,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
import jakarta.inject.Singleton;
import javax.net.ssl.SSLContext;
import java.io.File;
diff --git a/jooby/src/main/java/org/jooby/LifeCycle.java b/jooby/src/main/java/org/jooby/LifeCycle.java
index 103257cb..861d6c35 100644
--- a/jooby/src/main/java/org/jooby/LifeCycle.java
+++ b/jooby/src/main/java/org/jooby/LifeCycle.java
@@ -19,9 +19,9 @@
import org.jooby.funzy.Throwing;
import org.jooby.funzy.Try;
-import javax.annotation.Nonnull;
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.PreDestroy;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
diff --git a/jooby/src/main/java/org/jooby/Mutant.java b/jooby/src/main/java/org/jooby/Mutant.java
index c51b6d70..b6925c87 100644
--- a/jooby/src/main/java/org/jooby/Mutant.java
+++ b/jooby/src/main/java/org/jooby/Mutant.java
@@ -25,7 +25,7 @@
import com.google.inject.TypeLiteral;
import com.google.inject.util.Types;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
/**
*
diff --git a/jooby/src/main/java/org/jooby/Registry.java b/jooby/src/main/java/org/jooby/Registry.java
index add1982e..78b0a166 100644
--- a/jooby/src/main/java/org/jooby/Registry.java
+++ b/jooby/src/main/java/org/jooby/Registry.java
@@ -19,7 +19,7 @@
import com.google.inject.TypeLiteral;
import com.google.inject.name.Names;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
/**
*
service registry
diff --git a/jooby/src/main/java/org/jooby/Request.java b/jooby/src/main/java/org/jooby/Request.java
index e1d2e94a..470a6000 100644
--- a/jooby/src/main/java/org/jooby/Request.java
+++ b/jooby/src/main/java/org/jooby/Request.java
@@ -23,8 +23,8 @@
import static java.util.Objects.requireNonNull;
import org.jooby.scope.RequestScoped;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;
diff --git a/jooby/src/main/java/org/jooby/Response.java b/jooby/src/main/java/org/jooby/Response.java
index 64442bba..fd520350 100644
--- a/jooby/src/main/java/org/jooby/Response.java
+++ b/jooby/src/main/java/org/jooby/Response.java
@@ -27,8 +27,8 @@
import com.google.common.collect.ImmutableList;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
/**
* Give you access to the actual HTTP response. You can read/write headers and write HTTP body.
diff --git a/jooby/src/main/java/org/jooby/Result.java b/jooby/src/main/java/org/jooby/Result.java
index f42d5043..78d229eb 100644
--- a/jooby/src/main/java/org/jooby/Result.java
+++ b/jooby/src/main/java/org/jooby/Result.java
@@ -27,8 +27,8 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
/**
* Utility class for HTTP responses. Usually you start with a result {@link Results builder} and
diff --git a/jooby/src/main/java/org/jooby/Results.java b/jooby/src/main/java/org/jooby/Results.java
index 17f218a5..e8c323cf 100644
--- a/jooby/src/main/java/org/jooby/Results.java
+++ b/jooby/src/main/java/org/jooby/Results.java
@@ -17,7 +17,7 @@
import static java.util.Objects.requireNonNull;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
import java.util.function.Supplier;
/**
diff --git a/jooby/src/main/java/org/jooby/Route.java b/jooby/src/main/java/org/jooby/Route.java
index 6f36695e..68ddaa78 100644
--- a/jooby/src/main/java/org/jooby/Route.java
+++ b/jooby/src/main/java/org/jooby/Route.java
@@ -33,12 +33,11 @@
import org.jooby.internal.RouteSourceImpl;
import org.jooby.internal.SourceProvider;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.time.Duration;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
diff --git a/jooby/src/main/java/org/jooby/Router.java b/jooby/src/main/java/org/jooby/Router.java
index 72608e12..6bbf097f 100644
--- a/jooby/src/main/java/org/jooby/Router.java
+++ b/jooby/src/main/java/org/jooby/Router.java
@@ -19,7 +19,7 @@
import org.jooby.funzy.Try;
import org.jooby.handlers.AssetHandler;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
import java.net.URLDecoder;
import java.nio.file.Path;
import java.util.ArrayList;
diff --git a/jooby/src/main/java/org/jooby/Session.java b/jooby/src/main/java/org/jooby/Session.java
index 41909a40..6248e4d5 100644
--- a/jooby/src/main/java/org/jooby/Session.java
+++ b/jooby/src/main/java/org/jooby/Session.java
@@ -18,7 +18,7 @@
import com.google.common.io.BaseEncoding;
import static java.util.Objects.requireNonNull;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
import java.security.SecureRandom;
import java.util.Map;
import java.util.Optional;
diff --git a/jooby/src/main/java/org/jooby/Sse.java b/jooby/src/main/java/org/jooby/Sse.java
index 113b4b21..fb34fcf5 100644
--- a/jooby/src/main/java/org/jooby/Sse.java
+++ b/jooby/src/main/java/org/jooby/Sse.java
@@ -28,7 +28,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
import java.io.IOException;
import java.nio.channels.ClosedChannelException;
import java.nio.charset.StandardCharsets;
diff --git a/jooby/src/main/java/org/jooby/Upload.java b/jooby/src/main/java/org/jooby/Upload.java
index 4a6afb9a..ac6c51fc 100644
--- a/jooby/src/main/java/org/jooby/Upload.java
+++ b/jooby/src/main/java/org/jooby/Upload.java
@@ -15,7 +15,7 @@
*/
package org.jooby;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
diff --git a/jooby/src/main/java/org/jooby/View.java b/jooby/src/main/java/org/jooby/View.java
index 83b53539..d380d9e4 100644
--- a/jooby/src/main/java/org/jooby/View.java
+++ b/jooby/src/main/java/org/jooby/View.java
@@ -17,7 +17,7 @@
import static java.util.Objects.requireNonNull;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
diff --git a/jooby/src/main/java/org/jooby/WebSocket.java b/jooby/src/main/java/org/jooby/WebSocket.java
index c795e225..e808cf2d 100644
--- a/jooby/src/main/java/org/jooby/WebSocket.java
+++ b/jooby/src/main/java/org/jooby/WebSocket.java
@@ -24,8 +24,8 @@
import org.jooby.internal.WebSocketImpl;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
import java.io.Closeable;
import java.util.Map;
import java.util.Optional;
diff --git a/jooby/src/main/java/org/jooby/internal/WebSocketImpl.java b/jooby/src/main/java/org/jooby/internal/WebSocketImpl.java
index f4ad12f0..269f4646 100644
--- a/jooby/src/main/java/org/jooby/internal/WebSocketImpl.java
+++ b/jooby/src/main/java/org/jooby/internal/WebSocketImpl.java
@@ -34,7 +34,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nullable;
import java.io.EOFException;
import java.nio.channels.ClosedChannelException;
import java.nio.charset.StandardCharsets;
diff --git a/jooby/src/main/java/org/jooby/internal/parser/bean/BeanIndexedPath.java b/jooby/src/main/java/org/jooby/internal/parser/bean/BeanIndexedPath.java
index 282c3ce8..eda32326 100644
--- a/jooby/src/main/java/org/jooby/internal/parser/bean/BeanIndexedPath.java
+++ b/jooby/src/main/java/org/jooby/internal/parser/bean/BeanIndexedPath.java
@@ -23,7 +23,7 @@
import com.google.inject.TypeLiteral;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nullable;
@SuppressWarnings("rawtypes")
class BeanIndexedPath implements BeanPath {
diff --git a/jooby/src/main/java/org/jooby/package-info.java b/jooby/src/main/java/org/jooby/package-info.java
index 12f7005c..9b25b73d 100644
--- a/jooby/src/main/java/org/jooby/package-info.java
+++ b/jooby/src/main/java/org/jooby/package-info.java
@@ -19,5 +19,4 @@
* Jooby a scalable, fast and modular micro web framework for Java and Kotlin.
*
*/
-@javax.annotation.ParametersAreNonnullByDefault
package org.jooby;
diff --git a/jooby/src/test/java/org/jooby/EnvTest.java b/jooby/src/test/java/org/jooby/EnvTest.java
index 5a59a127..3eeef1ca 100644
--- a/jooby/src/test/java/org/jooby/EnvTest.java
+++ b/jooby/src/test/java/org/jooby/EnvTest.java
@@ -26,7 +26,7 @@
import static org.junit.Assert.fail;
import org.junit.Test;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nullable;
import java.util.List;
import java.util.Locale;
import java.util.Map;
diff --git a/jooby/src/test/java/org/jooby/LifeCycleTest.java b/jooby/src/test/java/org/jooby/LifeCycleTest.java
index 45a886e6..4ef8cf03 100644
--- a/jooby/src/test/java/org/jooby/LifeCycleTest.java
+++ b/jooby/src/test/java/org/jooby/LifeCycleTest.java
@@ -17,8 +17,8 @@
import org.junit.Test;
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.PreDestroy;
import java.io.IOException;
public class LifeCycleTest {
diff --git a/jooby/src/test/java/org/jooby/RequestTest.java b/jooby/src/test/java/org/jooby/RequestTest.java
index 9a211bf7..58e74844 100644
--- a/jooby/src/test/java/org/jooby/RequestTest.java
+++ b/jooby/src/test/java/org/jooby/RequestTest.java
@@ -37,7 +37,7 @@
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
-import javax.annotation.Nonnull;
+import jakarta.annotation.Nonnull;
public class RequestTest {
public class RequestMock implements Request {
diff --git a/jooby/src/test/java/org/jooby/WebSocketTest.java b/jooby/src/test/java/org/jooby/WebSocketTest.java
index 4f6d4efe..06220e3f 100644
--- a/jooby/src/test/java/org/jooby/WebSocketTest.java
+++ b/jooby/src/test/java/org/jooby/WebSocketTest.java
@@ -26,7 +26,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.annotation.Nullable;
+import jakarta.annotation.Nullable;
import java.util.LinkedList;
import java.util.Map;
import java.util.Optional;
From 1a3511ad572c58e1327d676c1d5ba0cf4d2152e1 Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 00:41:25 +0700
Subject: [PATCH 06/15] jooby: better version properties management
---
automaton/pom.xml | 3 --
pom.xml | 81 +++++++++++++++++++++++++++++++++++++++++++++--
skeleton/pom.xml | 12 +++----
xmlloader/pom.xml | 3 --
4 files changed, 84 insertions(+), 15 deletions(-)
diff --git a/automaton/pom.xml b/automaton/pom.xml
index c22ed36f..06aed9f2 100644
--- a/automaton/pom.xml
+++ b/automaton/pom.xml
@@ -38,13 +38,11 @@
jakarta.activation
jakarta.activation-api
- 2.1.0
runtime
jakarta.xml.bind
jakarta.xml.bind-api
- 4.0.0
org.awaitility
@@ -54,7 +52,6 @@
org.glassfish.jaxb
jaxb-runtime
- 4.0.0
runtime
diff --git a/pom.xml b/pom.xml
index 750c6ccb..dde51fbf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,23 +68,98 @@
true
17
-Xmx${build.jvmsize} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED
+
+ 7.0.0
+
+ 2.0.1
+
+ 5.0.0
+
+ 3.0.6
+
+ 11.0.24
+
+ 2.1.1
+
+ 3.0.2
+
+ 3.0.0
+
+ 3.0.18
+
+ 2.13.4
+
+ 3.30.2-GA
+
+ 2.1.0
+
+ 4.0.0
+
+ 4.0.0
com.google.inject
guice
- 6.0.0
+ ${guice.version}
com.google.inject.extensions
guice-servlet
- 6.0.0
+ ${guice.version}
jakarta.inject
jakarta.inject-api
- 2.0.1
+ ${jakarta.inject-api.version}
+
+
+ com.fasterxml.jackson.jakarta.rs
+ jackson-jakarta-rs-json-provider
+ ${jackson.jakarta.rs.version}
+
+
+ jakarta.activation
+ jakarta.activation-api
+ ${jakarta.activation-api.version}
+
+
+ jakarta.xml.bind
+ jakarta.xml.bind-api
+ ${jaxb-api.version}
+
+
+ org.glassfish.jaxb
+ jaxb-runtime
+ ${jaxb-runtime.version}
+
+
+
+ com.sun.activation
+ jakarta.activation
+
+
+
+
+ org.javassist
+ javassist
+ ${javassist.version}
+
+
+ org.eclipse.jetty.http2
+ http2-server
+ ${jetty.version}
+
+
+ org.eclipse.jetty
+ jetty-alpn-server
+ ${jetty.version}
+
+
+ org.eclipse.jetty.websocket
+ websocket-jetty-api
+ ${jetty.version}
org.kill-bill.commons
diff --git a/skeleton/pom.xml b/skeleton/pom.xml
index b48cd2a0..cd276938 100644
--- a/skeleton/pom.xml
+++ b/skeleton/pom.xml
@@ -50,8 +50,8 @@
test
- com.fasterxml.jackson.jaxrs
- jackson-jaxrs-json-provider
+ com.fasterxml.jackson.jakarta.rs
+ jackson-jakarta-rs-json-provider
true
@@ -83,8 +83,8 @@
jakarta.ws.rs-api
- javax.inject
- javax.inject
+ jakarta.inject
+ jakarta.inject-api
provided
@@ -97,8 +97,8 @@
test
- org.eclipse.jetty.orbit
- javax.servlet
+ org.eclipse.jetty.toolchain
+ jetty-jakarta-servlet-api
diff --git a/xmlloader/pom.xml b/xmlloader/pom.xml
index ed73f6cc..6ea7562a 100644
--- a/xmlloader/pom.xml
+++ b/xmlloader/pom.xml
@@ -39,13 +39,11 @@
jakarta.activation
jakarta.activation-api
- 2.1.0
runtime
jakarta.xml.bind
jakarta.xml.bind-api
- 4.0.0
org.awaitility
@@ -55,7 +53,6 @@
org.glassfish.jaxb
jaxb-runtime
- 4.0.0
runtime
From 70cde0ff69b03b8051fd8f76cd20a7f88b30c34f Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 01:21:46 +0700
Subject: [PATCH 07/15] jooby: move metrics module from javax to jakarta
namespace
---
.../metrics/servlets/HealthCheckServlet.java | 14 ++++++-------
.../metrics/servlets/InstrumentedFilter.java | 20 +++++++++----------
.../metrics/servlets/MetricsServlet.java | 14 ++++++-------
.../metrics/servlets/ThreadDumpServlet.java | 6 +++---
4 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/metrics/src/main/java/org/killbill/commons/metrics/servlets/HealthCheckServlet.java b/metrics/src/main/java/org/killbill/commons/metrics/servlets/HealthCheckServlet.java
index 6d2c02e4..dfd89d43 100644
--- a/metrics/src/main/java/org/killbill/commons/metrics/servlets/HealthCheckServlet.java
+++ b/metrics/src/main/java/org/killbill/commons/metrics/servlets/HealthCheckServlet.java
@@ -23,13 +23,13 @@
import java.util.SortedMap;
import java.util.TreeMap;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.killbill.commons.health.api.HealthCheckRegistry;
import org.killbill.commons.health.api.Result;
diff --git a/metrics/src/main/java/org/killbill/commons/metrics/servlets/InstrumentedFilter.java b/metrics/src/main/java/org/killbill/commons/metrics/servlets/InstrumentedFilter.java
index d80485e4..7e4f9db5 100644
--- a/metrics/src/main/java/org/killbill/commons/metrics/servlets/InstrumentedFilter.java
+++ b/metrics/src/main/java/org/killbill/commons/metrics/servlets/InstrumentedFilter.java
@@ -25,16 +25,16 @@
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
-import javax.servlet.AsyncEvent;
-import javax.servlet.AsyncListener;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
+import jakarta.servlet.AsyncEvent;
+import jakarta.servlet.AsyncListener;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponseWrapper;
import org.killbill.commons.metrics.api.Counter;
import org.killbill.commons.metrics.api.Meter;
diff --git a/metrics/src/main/java/org/killbill/commons/metrics/servlets/MetricsServlet.java b/metrics/src/main/java/org/killbill/commons/metrics/servlets/MetricsServlet.java
index 23a776e6..881a87de 100644
--- a/metrics/src/main/java/org/killbill/commons/metrics/servlets/MetricsServlet.java
+++ b/metrics/src/main/java/org/killbill/commons/metrics/servlets/MetricsServlet.java
@@ -21,13 +21,13 @@
import java.io.OutputStream;
import java.util.concurrent.TimeUnit;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.killbill.commons.metrics.api.MetricRegistry;
import org.killbill.commons.metrics.impl.NoOpMetricRegistry;
diff --git a/metrics/src/main/java/org/killbill/commons/metrics/servlets/ThreadDumpServlet.java b/metrics/src/main/java/org/killbill/commons/metrics/servlets/ThreadDumpServlet.java
index 5eb26573..8c37ed21 100644
--- a/metrics/src/main/java/org/killbill/commons/metrics/servlets/ThreadDumpServlet.java
+++ b/metrics/src/main/java/org/killbill/commons/metrics/servlets/ThreadDumpServlet.java
@@ -29,9 +29,9 @@
import java.lang.management.ThreadMXBean;
import java.nio.charset.StandardCharsets;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
public class ThreadDumpServlet extends HttpServlet {
From c8ed11bf0cddf6b5f71e0f784008963888df94d7 Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 01:22:46 +0700
Subject: [PATCH 08/15] jooby: move skeleton module from javax to jakarta
namespace
---
.../listeners/GuiceServletContextListener.java | 2 +-
.../listeners/JULServletContextListener.java | 4 ++--
.../skeleton/metrics/TimedResourceInterceptor.java | 6 +++---
.../commons/skeleton/modules/BaseServerModule.java | 4 ++--
.../skeleton/modules/BaseServerModuleBuilder.java | 4 ++--
.../skeleton/modules/GuiceServletContainer.java | 10 +++++-----
.../skeleton/modules/JerseyBaseServerModule.java | 4 ++--
.../skeleton/modules/TimedInterceptionService.java | 6 +++---
.../servlets/LogInvalidResourcesServlet.java | 8 ++++----
.../metrics/TestTimedResourceInterceptor.java | 10 +++++-----
.../modules/AbstractBaseServerModuleTest.java | 2 +-
.../commons/skeleton/modules/HelloFilter.java | 12 ++++++------
.../commons/skeleton/modules/HelloResource.java | 14 +++++++-------
.../skeleton/modules/SomeGuiceyDependency.java | 2 +-
.../modules/TestJerseyBaseServerModule.java | 2 +-
15 files changed, 45 insertions(+), 45 deletions(-)
diff --git a/skeleton/src/main/java/org/killbill/commons/skeleton/listeners/GuiceServletContextListener.java b/skeleton/src/main/java/org/killbill/commons/skeleton/listeners/GuiceServletContextListener.java
index 352e8047..d06e48eb 100644
--- a/skeleton/src/main/java/org/killbill/commons/skeleton/listeners/GuiceServletContextListener.java
+++ b/skeleton/src/main/java/org/killbill/commons/skeleton/listeners/GuiceServletContextListener.java
@@ -21,7 +21,7 @@
import java.util.List;
-import javax.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextEvent;
import org.killbill.commons.utils.Strings;
import org.slf4j.Logger;
diff --git a/skeleton/src/main/java/org/killbill/commons/skeleton/listeners/JULServletContextListener.java b/skeleton/src/main/java/org/killbill/commons/skeleton/listeners/JULServletContextListener.java
index 5418c332..410dc110 100644
--- a/skeleton/src/main/java/org/killbill/commons/skeleton/listeners/JULServletContextListener.java
+++ b/skeleton/src/main/java/org/killbill/commons/skeleton/listeners/JULServletContextListener.java
@@ -23,8 +23,8 @@
import java.util.logging.LogManager;
import java.util.logging.Logger;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
+import jakarta.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextListener;
import org.slf4j.bridge.SLF4JBridgeHandler;
diff --git a/skeleton/src/main/java/org/killbill/commons/skeleton/metrics/TimedResourceInterceptor.java b/skeleton/src/main/java/org/killbill/commons/skeleton/metrics/TimedResourceInterceptor.java
index d0441027..c605cddb 100644
--- a/skeleton/src/main/java/org/killbill/commons/skeleton/metrics/TimedResourceInterceptor.java
+++ b/skeleton/src/main/java/org/killbill/commons/skeleton/metrics/TimedResourceInterceptor.java
@@ -27,9 +27,9 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
+import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.ExceptionMapper;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
diff --git a/skeleton/src/main/java/org/killbill/commons/skeleton/modules/BaseServerModule.java b/skeleton/src/main/java/org/killbill/commons/skeleton/modules/BaseServerModule.java
index 886aba64..f69fb0d5 100644
--- a/skeleton/src/main/java/org/killbill/commons/skeleton/modules/BaseServerModule.java
+++ b/skeleton/src/main/java/org/killbill/commons/skeleton/modules/BaseServerModule.java
@@ -24,8 +24,8 @@
import java.util.Map;
import java.util.Map.Entry;
-import javax.servlet.Filter;
-import javax.servlet.http.HttpServlet;
+import jakarta.servlet.Filter;
+import jakarta.servlet.http.HttpServlet;
import com.google.inject.servlet.ServletModule;
diff --git a/skeleton/src/main/java/org/killbill/commons/skeleton/modules/BaseServerModuleBuilder.java b/skeleton/src/main/java/org/killbill/commons/skeleton/modules/BaseServerModuleBuilder.java
index 1baff835..24d81817 100644
--- a/skeleton/src/main/java/org/killbill/commons/skeleton/modules/BaseServerModuleBuilder.java
+++ b/skeleton/src/main/java/org/killbill/commons/skeleton/modules/BaseServerModuleBuilder.java
@@ -24,8 +24,8 @@
import java.util.List;
import java.util.Map;
-import javax.servlet.Filter;
-import javax.servlet.http.HttpServlet;
+import jakarta.servlet.Filter;
+import jakarta.servlet.http.HttpServlet;
public class BaseServerModuleBuilder {
diff --git a/skeleton/src/main/java/org/killbill/commons/skeleton/modules/GuiceServletContainer.java b/skeleton/src/main/java/org/killbill/commons/skeleton/modules/GuiceServletContainer.java
index 0552009f..a4193756 100644
--- a/skeleton/src/main/java/org/killbill/commons/skeleton/modules/GuiceServletContainer.java
+++ b/skeleton/src/main/java/org/killbill/commons/skeleton/modules/GuiceServletContainer.java
@@ -19,10 +19,10 @@
import java.util.Set;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import javax.servlet.ServletException;
-import javax.ws.rs.ext.MessageBodyWriter;
+import jakarta.inject.Inject;
+import jakarta.inject.Singleton;
+import jakarta.servlet.ServletException;
+import jakarta.ws.rs.ext.MessageBodyWriter;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
@@ -37,7 +37,7 @@
import org.killbill.commons.utils.Strings;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider;
import com.google.inject.Injector;
import com.google.inject.TypeLiteral;
diff --git a/skeleton/src/main/java/org/killbill/commons/skeleton/modules/JerseyBaseServerModule.java b/skeleton/src/main/java/org/killbill/commons/skeleton/modules/JerseyBaseServerModule.java
index 86e1d048..51eec70a 100644
--- a/skeleton/src/main/java/org/killbill/commons/skeleton/modules/JerseyBaseServerModule.java
+++ b/skeleton/src/main/java/org/killbill/commons/skeleton/modules/JerseyBaseServerModule.java
@@ -26,8 +26,8 @@
import java.util.Map.Entry;
import java.util.Objects;
-import javax.servlet.Filter;
-import javax.servlet.http.HttpServlet;
+import jakarta.servlet.Filter;
+import jakarta.servlet.http.HttpServlet;
import org.glassfish.jersey.server.ServerProperties;
import org.killbill.commons.utils.Joiner;
diff --git a/skeleton/src/main/java/org/killbill/commons/skeleton/modules/TimedInterceptionService.java b/skeleton/src/main/java/org/killbill/commons/skeleton/modules/TimedInterceptionService.java
index 8b7077d9..842a3362 100644
--- a/skeleton/src/main/java/org/killbill/commons/skeleton/modules/TimedInterceptionService.java
+++ b/skeleton/src/main/java/org/killbill/commons/skeleton/modules/TimedInterceptionService.java
@@ -24,9 +24,9 @@
import java.util.List;
import java.util.Set;
-import javax.inject.Singleton;
-import javax.ws.rs.HttpMethod;
-import javax.ws.rs.Path;
+import jakarta.inject.Singleton;
+import jakarta.ws.rs.HttpMethod;
+import jakarta.ws.rs.Path;
import org.aopalliance.intercept.ConstructorInterceptor;
import org.aopalliance.intercept.MethodInterceptor;
diff --git a/skeleton/src/main/java/org/killbill/commons/skeleton/servlets/LogInvalidResourcesServlet.java b/skeleton/src/main/java/org/killbill/commons/skeleton/servlets/LogInvalidResourcesServlet.java
index 552f12e6..c06717aa 100644
--- a/skeleton/src/main/java/org/killbill/commons/skeleton/servlets/LogInvalidResourcesServlet.java
+++ b/skeleton/src/main/java/org/killbill/commons/skeleton/servlets/LogInvalidResourcesServlet.java
@@ -21,10 +21,10 @@
import java.io.IOException;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/skeleton/src/test/java/org/killbill/commons/skeleton/metrics/TestTimedResourceInterceptor.java b/skeleton/src/test/java/org/killbill/commons/skeleton/metrics/TestTimedResourceInterceptor.java
index 3b9928ef..ca2e512e 100644
--- a/skeleton/src/test/java/org/killbill/commons/skeleton/metrics/TestTimedResourceInterceptor.java
+++ b/skeleton/src/test/java/org/killbill/commons/skeleton/metrics/TestTimedResourceInterceptor.java
@@ -24,11 +24,11 @@
import java.util.List;
import java.util.Set;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.PUT;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.Response;
import org.aopalliance.intercept.MethodInterceptor;
import org.glassfish.hk2.api.InterceptionService;
diff --git a/skeleton/src/test/java/org/killbill/commons/skeleton/modules/AbstractBaseServerModuleTest.java b/skeleton/src/test/java/org/killbill/commons/skeleton/modules/AbstractBaseServerModuleTest.java
index 36a81487..e692f41f 100644
--- a/skeleton/src/test/java/org/killbill/commons/skeleton/modules/AbstractBaseServerModuleTest.java
+++ b/skeleton/src/test/java/org/killbill/commons/skeleton/modules/AbstractBaseServerModuleTest.java
@@ -22,7 +22,7 @@
import java.io.IOException;
import java.net.ServerSocket;
-import javax.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextEvent;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
diff --git a/skeleton/src/test/java/org/killbill/commons/skeleton/modules/HelloFilter.java b/skeleton/src/test/java/org/killbill/commons/skeleton/modules/HelloFilter.java
index d0706118..aa00391e 100644
--- a/skeleton/src/test/java/org/killbill/commons/skeleton/modules/HelloFilter.java
+++ b/skeleton/src/test/java/org/killbill/commons/skeleton/modules/HelloFilter.java
@@ -19,12 +19,12 @@
import java.io.IOException;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import javax.ws.rs.container.ContainerRequestContext;
-import javax.ws.rs.container.ContainerRequestFilter;
-import javax.ws.rs.container.ContainerResponseContext;
-import javax.ws.rs.container.ContainerResponseFilter;
+import jakarta.inject.Inject;
+import jakarta.inject.Singleton;
+import jakarta.ws.rs.container.ContainerRequestContext;
+import jakarta.ws.rs.container.ContainerRequestFilter;
+import jakarta.ws.rs.container.ContainerResponseContext;
+import jakarta.ws.rs.container.ContainerResponseFilter;
import org.testng.Assert;
diff --git a/skeleton/src/test/java/org/killbill/commons/skeleton/modules/HelloResource.java b/skeleton/src/test/java/org/killbill/commons/skeleton/modules/HelloResource.java
index 2a75fe39..033c58ba 100644
--- a/skeleton/src/test/java/org/killbill/commons/skeleton/modules/HelloResource.java
+++ b/skeleton/src/test/java/org/killbill/commons/skeleton/modules/HelloResource.java
@@ -21,13 +21,13 @@
import java.util.Map;
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
+import jakarta.inject.Inject;
+import jakarta.inject.Singleton;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
import org.joda.time.LocalDate;
import org.killbill.commons.metrics.api.annotation.TimedResource;
diff --git a/skeleton/src/test/java/org/killbill/commons/skeleton/modules/SomeGuiceyDependency.java b/skeleton/src/test/java/org/killbill/commons/skeleton/modules/SomeGuiceyDependency.java
index 32ba4c5c..5d44e4a4 100644
--- a/skeleton/src/test/java/org/killbill/commons/skeleton/modules/SomeGuiceyDependency.java
+++ b/skeleton/src/test/java/org/killbill/commons/skeleton/modules/SomeGuiceyDependency.java
@@ -17,7 +17,7 @@
package org.killbill.commons.skeleton.modules;
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
@Singleton
public class SomeGuiceyDependency {
diff --git a/skeleton/src/test/java/org/killbill/commons/skeleton/modules/TestJerseyBaseServerModule.java b/skeleton/src/test/java/org/killbill/commons/skeleton/modules/TestJerseyBaseServerModule.java
index 6183755f..a265a23f 100644
--- a/skeleton/src/test/java/org/killbill/commons/skeleton/modules/TestJerseyBaseServerModule.java
+++ b/skeleton/src/test/java/org/killbill/commons/skeleton/modules/TestJerseyBaseServerModule.java
@@ -42,7 +42,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.joda.JodaModule;
-import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
+import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
From 28eafbbce7b029f509a8b232baaae2448224350c Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 01:23:31 +0700
Subject: [PATCH 09/15] jooby: update jooby module documents
---
jooby/CHANGES.md | 6 +++---
jooby/README.md | 11 +++++++++++
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/jooby/CHANGES.md b/jooby/CHANGES.md
index 22db8bc3..dd2f237a 100644
--- a/jooby/CHANGES.md
+++ b/jooby/CHANGES.md
@@ -37,7 +37,7 @@ Jetty 11 / Servlet 5 (`jakarta.servlet` namespace):
| File | Change | Reason |
|---|---|---|
-| `pom.xml` | Added local `jetty.version=11.0.24` and `jakarta.servlet.version=5.0.0`; updated `jetty-server` and `jakarta.servlet-api`; excluded `org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api` from `jetty-server` | Jetty 11 is the latest `11.0.x` patch line compatible with the repository's managed `slf4j-api:2.0.9`; the exclusion avoids duplicate Servlet 5 classes on the test classpath |
+| `pom.xml` | Switched the maintained fork to Jetty `11.0.24` and `jakarta.servlet-api` `5.0.0`; updated `jetty-server` / `jakarta.servlet-api`; excluded `org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api` from `jetty-server` | Jetty 11 is the latest `11.0.x` patch line compatible with the repository's managed `slf4j-api:2.0.9`; the exclusion avoids duplicate Servlet 5 classes on the test classpath |
| `src/main/java/org/jooby/internal/jetty/JettyHandler.java` | Replaced `javax.servlet.*` imports with `jakarta.servlet.*` | Jetty 11 uses Servlet 5 / Jakarta namespace only |
| `src/main/java/org/jooby/internal/jetty/JettyResponse.java` | Replaced `javax.servlet.http.*` imports with `jakarta.servlet.http.*` | Jetty 11 uses Servlet 5 / Jakarta namespace only |
| `src/main/java/org/jooby/internal/jetty/JettySse.java` | Replaced `javax.servlet.http.HttpServletResponse` with `jakarta.servlet.http.HttpServletResponse` | Jetty 11 uses Servlet 5 / Jakarta namespace only |
@@ -68,7 +68,7 @@ Differences from upstream dependency versions:
| Dependency | Upstream | Kill Bill Fork | Reason |
|---|---|---|---|
-| `com.google.inject:guice` | 4.2.0 | 5.1.0 (managed by killbill-oss-parent) | Kill Bill standardized version |
+| `com.google.inject:guice` | 4.2.0 | 7.0.0 (managed in root pom) | Current Kill Bill Jakarta baseline |
| `com.google.inject.extensions:guice-multibindings` | 4.2.0 | **removed** | `Multibinder` merged into core Guice since 4.2 |
| `org.jooby:funzy` | 0.1.0 (external dep) | **removed** (source inlined) | 3 classes copied into `org.jooby.funzy` package |
| `org.eclipse.jetty:jetty-server` | 9.4.24.v20191120 | 11.0.24 | Jetty 11 is the newest `11.0.x` line compatible with the repository-managed `slf4j-api:2.0.9`; local exclusion avoids duplicate Servlet API classes |
@@ -159,7 +159,7 @@ Notable rewrites and follow-up restorations:
| `FileConfTest.java` | Rewritten as a real filesystem test | Replaces EasyMock + PowerMock constructor/static mocking |
| `LogbackConfTest.java` | Rewritten as a real filesystem/config-driven test | Replaces MockUnit-based lookup stubbing |
| `RequestScopeTest.java` | Rewritten as a direct behavior test | Exercises circular-proxy handling without a compile-time Guice internal type dependency |
-| `JettyHandlerTest.java` | Rewritten around current Jetty 10 adapter behavior | Upstream websocket-era expectations no longer matched the fork |
+| `JettyHandlerTest.java` | Rewritten around current Jetty adapter behavior | Upstream websocket-era expectations no longer matched the maintained fork |
| `JettyServerTest.java` | Rewritten around real `Server`, `ServerConnector`, and `ContextHandler` objects | Replaces removed Jetty 9 websocket factory assumptions |
| `SseFeature.java` | Rewritten to use JDK 11 `HttpClient` | Replaces removed Ning AsyncHttpClient dependency |
diff --git a/jooby/README.md b/jooby/README.md
index 2f3605af..02cdea3d 100644
--- a/jooby/README.md
+++ b/jooby/README.md
@@ -17,6 +17,15 @@ The following upstream modules are merged into this single artifact:
Not forked:
- `org.jooby:jooby-netty` — Kill Bill uses Jetty; SSE/WebSocket are handled via the core SPI layer (`org.jooby.spi.*`).
+## Current Maintained Baseline
+
+- The fork remains based on upstream **Jooby 1.6.9** and is maintained in place.
+- The current web/runtime baseline is **Guice 7.0.0**, **Jetty 11.0.24**, and
+ **`jakarta.servlet-api` 5.0.0**.
+- Jooby tests run in the standard Maven lifecycle; the old `-Pjooby` gate is gone.
+- Active Jooby test baseline: **124** Java files in `src/test/java`, **108** runnable test
+ classes, **923** tests.
+
## Building & Testing
`killbill-jooby` keeps the upstream **JUnit 4** test stack. It does **not** use the
@@ -37,3 +46,5 @@ Changes with upstream:
```
git diff -w 85a50d5e894d14068b2e90a0601481cf52a0abec...HEAD jooby/src/main/java/org/jooby
```
+
+For a detailed audit of the maintained-fork deltas, see `jooby/CHANGES.md`.
From f85eff1faec9725e99d1f552cc9a8421e6342fcd Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 01:23:44 +0700
Subject: [PATCH 10/15] agents: update plans
---
jooby/phase-3-plans.md | 58 --------------------------
killbill-jooby-todo.md | 95 +++++++++++++++++++++++++-----------------
2 files changed, 57 insertions(+), 96 deletions(-)
delete mode 100644 jooby/phase-3-plans.md
diff --git a/jooby/phase-3-plans.md b/jooby/phase-3-plans.md
deleted file mode 100644
index 1127a231..00000000
--- a/jooby/phase-3-plans.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# Phase 3 Plans
-
-This document records the current Jooby fork baseline and Phase 3 constraints while the repository
-moves from `javax.*` to `jakarta.*`.
-
-## Current Baseline
-
-- Repository baseline validated on Temurin **JDK 17.0.18** with **Maven 3.8.5**
-- Root dependency baseline:
- - `project.build.targetJdk=17`
- - `com.google.inject:guice=6.0.0`
- - `com.google.inject.extensions:guice-servlet=6.0.0`
-- Root build baseline:
- - `mvn -q clean install -DskipTests`
-- Root test baseline:
- - `mvn clean test`
-- Jooby module test baseline:
- - `mvn clean test`
-- Active Jooby test tree:
- - `124` Java files in `src/test/java`
- - `108` runnable test classes
- - `923` tests
- - `src/test/java-excluded/` is empty
-
-## Current Dependency Baseline Relevant to Phase 3
-
-| Area | Current state |
-|---|---|
-| Inject namespace | `killbill-jooby`, `queue`, `jdbi`, and `metrics` now use `jakarta.inject`; `skeleton` remains on `javax.inject` until Jersey 2 / HK2 is replaced |
-| Servlet namespace | `jakarta.servlet:jakarta.servlet-api:4.0.4` is still a transitional artifact that exposes `javax.servlet` packages |
-| JAX-RS namespace | `skeleton` still uses `javax.ws.rs` with Jersey 2.39.1 |
-| Guice servlet bridge | `guice-servlet` is still `6.0.0`, so servlet integration remains on the `javax.servlet` side |
-| Jetty | The Jooby fork already runs on Jetty `10.0.16` |
-
-## Phase 3 Sequence
-
-1. `javax.inject` -> `jakarta.inject` for modules not blocked by Jersey 2 / HK2
-2. `javax.servlet` -> `jakarta.servlet`
-3. `javax.ws.rs` -> `jakarta.ws.rs` plus Jersey 3
-4. Upgrade to Guice 7 once the earlier Jakarta steps are ready
-
-## Phase 3 Notes
-
-- `jooby/CHANGES.md` is the durable source of truth for fork differences from upstream Jooby 1.6.9.
-- The Jooby module is still the best canary because it exercises Guice, servlet, Jetty, and the
- migrated Mockito-based test tree in one module.
-- The old `-Pjooby` test gate is gone; Jooby tests run in the standard Maven lifecycle.
-- JDK 17 does not need to be the machine default, but Maven commands for this phase must run in a
- shell that has JDK 17 selected explicitly when multiple JDKs are installed.
-- Root `surefireArgLine` already overrides the parent's obsolete JDK 17 profile flags.
-- Full reactor tests, plus focused `jooby`, `skeleton`, `metrics`, and `queue` test runs, already
- passed with JDK 17 + Guice 6.0.0.
-- `guice-servlet` 6.0.0 still uses `javax.servlet`; that makes Phase 3 servlet work awkward until
- the Guice 7 step is taken or coordinated with it.
-- Guice 6 accepts `jakarta.inject` annotations, but provider-facing Jooby code still needs
- `com.google.inject.Provider` when interacting with Guice binding APIs.
-- `skeleton` must stay on `javax.inject` until the Jersey 2 / HK2 layer is migrated because HK2
- still enforces `javax.inject.Singleton` semantics during Jersey bootstrap.
diff --git a/killbill-jooby-todo.md b/killbill-jooby-todo.md
index 4337f3d1..6e37ee4f 100644
--- a/killbill-jooby-todo.md
+++ b/killbill-jooby-todo.md
@@ -9,25 +9,22 @@
## Phase 0 — Current State Assessment ✅
-- The codebase targets **JDK 11** as baseline (`project.build.targetJdk=11` via `killbill-oss-parent:0.146.63`).
-- 90 Java source files use `javax.*` imports — zero `jakarta.*` imports exist anywhere.
-- Maven coordinates already use transitional `jakarta.*` groupIds for some dependencies, but these still ship `javax.*` packages:
- - `jakarta.servlet:jakarta.servlet-api` in `skeleton`, `metrics` (code uses `javax.servlet.*`).
- - `jakarta.ws.rs:jakarta.ws.rs-api` in `skeleton` (code uses `javax.ws.rs.*`).
- - `jakarta.xml.bind:jakarta.xml.bind-api` in `automaton`, `xmlloader` (code uses `javax.xml.bind.*`).
- - `jakarta.activation:jakarta.activation-api` in `automaton`, `xmlloader`.
-- `jakarta.inject:jakarta.inject-api` is now the explicit Maven artifact in `killbill-jooby`, `queue`, `jdbi`, and `metrics`.
-- `skeleton` still uses `javax.inject` for now because Jersey 2 / HK2 still expects that namespace.
-- Guice version is **6.0.0** (overridden in this repository; supports both `javax.inject` and `jakarta.inject` annotations).
-- Jersey version is **2.39.1** (supports `javax.ws.rs` only; Jersey 3.x requires `jakarta.ws.rs`).
-- `javax.servlet` imports span 12 files: `skeleton` (8 files), `metrics` (4 files).
-- `javax.ws.rs` imports span 6 files: `skeleton` only.
-- `javax.xml.bind` imports span 14 files: `automaton` (7 files), `xmlloader` (7 files).
-- `javax.annotation.Nullable`/`@Nonnull` (from `jsr305`) is used in 35 files across 8 modules.
- - This does NOT need migration — `jsr305` is not part of the Jakarta namespace transition.
-- `javax.sql` is used in 22 files across 5 modules — this is core JDK, NOT part of Jakarta migration.
-- Jooby 1.6.9 uses `javax.*` namespace, which matches the current codebase state.
- - The Jakarta migration keeps the existing `killbill-jooby` fork and updates it in place during Phases 3-4.
+- The repository currently targets **JDK 17** in-repo via `project.build.targetJdk=17`, while still inheriting from `killbill-oss-parent:0.146.63`.
+- The Jakarta migration is complete for the targeted Java EE APIs:
+ - `javax.inject` -> `jakarta.inject`
+ - `javax.servlet` -> `jakarta.servlet`
+ - `javax.ws.rs` -> `jakarta.ws.rs`
+ - `javax.xml.bind` -> `jakarta.xml.bind`
+- `killbill-jooby` no longer has direct `javax.annotation` usage.
+- `jakarta.inject:jakarta.inject-api` is now the explicit Maven artifact in `killbill-jooby`, `queue`, `jdbi`, `metrics`, and `skeleton`.
+- Guice version is **7.0.0** (overridden in this repository; now aligned with the Jakarta servlet stack).
+- Jersey version is **3.0.18** with HK2 **3.0.6** in `skeleton` (Jakarta namespace line).
+- `killbill-jooby` and `skeleton` now use Jetty **11.0.24**.
+- Remaining `javax.*` usage is **not** the already-migrated Jakarta surface:
+ - `javax.annotation.*` from `jsr305` still appears in several modules and is outside the Jakarta EE migration scope.
+ - JDK namespaces like `javax.sql`, `javax.net.ssl`, `javax.crypto`, `javax.xml`, `javax.management`, and `javax.naming` remain where appropriate.
+- So the repository is **not literally `javax.*`-free**, but it is free of the targeted `javax` APIs that were part of this Jakarta migration.
+- The Jakarta migration keeps the existing `killbill-jooby` fork and updates it in place during Phases 3-4.
- `killbill-commons` already contains vendored forks: `jdbi` (fork of jDBI 2.62) and `config-magic` (fork of config-magic 0.17).
- `killbill-jooby` follows the same forking pattern.
@@ -75,10 +72,10 @@
- Complete POM written from scratch — see `jooby/CHANGES.md` for the full dependency version mapping table.
- `guice-multibindings` removed (merged into core Guice since 4.2).
- `funzy` removed as external dep (inlined into `org.jooby.funzy`).
-- `javax.servlet-api` → `jakarta.servlet:jakarta.servlet-api:4.0.4` (transitional, still ships `javax.servlet`).
-- Jetty upgraded from 9.4.24 → 10.0.16; `websocket-server` → `websocket-jetty-server`; `jetty-alpn-server` added.
+- `javax.servlet-api` was first replaced by `jakarta.servlet:jakarta.servlet-api` during the forking work and later moved to the current Servlet **5.0.0** baseline in the Jakarta migration.
+- Jetty was first upgraded from 9.4.24 → 10.0.16 during the initial fork and later moved to the current Jetty **11.0.24** baseline.
- ASM shade plugin preserved (`org.objectweb.asm` → `org.jooby.internal.asm`).
-- `jakarta.annotation-api:1.3.5` added for `@PostConstruct`/`@PreDestroy`.
+- `jakarta.annotation-api:2.1.1` added for Jooby's `@PostConstruct`/`@PreDestroy` and nullability annotations after removing the fork's direct `javax.annotation` usage.
- PowerMock removed (obsolete for modern JDKs).
- All other deps aligned to Kill Bill managed versions (Jackson, Guava, SLF4J, Typesafe Config).
@@ -157,14 +154,14 @@
- Source: `src/test/java-excluded/org/jooby/internal/jetty/JettyHandlerTest.java`
- Target path: `src/test/java/org/jooby/internal/jetty/JettyHandlerTest.java`
-- Restored as a current-behavior Jetty 10 test in `src/test/java/org/jooby/internal/jetty/JettyHandlerTest.java`.
+- Restored as a current-behavior Jetty adapter test in `src/test/java/org/jooby/internal/jetty/JettyHandlerTest.java`.
- Re-review target: `src/main/java/org/jooby/internal/jetty/JettyHandler.java`.
## 15. Rewrite `JettyServerTest` ✅
- Source: `src/test/java-excluded/org/jooby/internal/jetty/JettyServerTest.java`
- Target path: `src/test/java/org/jooby/internal/jetty/JettyServerTest.java`
-- Restored as a direct Jetty 10 wiring test in `src/test/java/org/jooby/internal/jetty/JettyServerTest.java`.
+- Restored as a direct Jetty wiring test in `src/test/java/org/jooby/internal/jetty/JettyServerTest.java`.
- Re-review target: `src/main/java/org/jooby/internal/jetty/JettyServer.java`.
## 16. Restore `SseFeature` ✅
@@ -213,32 +210,30 @@
- Replace `javax.inject:javax.inject` with `jakarta.inject:jakarta.inject-api:2.0.1` in all POMs.
- In all Java source files, replace `import javax.inject.*` with `import jakarta.inject.*`.
- - Completed in-repo for `killbill-jooby`, `queue`, `jdbi`, and `metrics`.
- - `skeleton` is intentionally deferred: Jersey 2 / HK2 still expects `javax.inject` semantics there.
+ - Completed in-repo for `killbill-jooby`, `queue`, `jdbi`, `metrics`, and `skeleton`.
- Affected annotations: `@Inject`, `@Named`, `@Singleton`, `@Qualifier`, `@Scope`.
-- Verify Guice 6.0 resolves `jakarta.inject` annotations correctly alongside any remaining `javax.inject` from transitive deps.
+- Verify Guice 7.0 resolves `jakarta.inject` annotations correctly across the migrated modules.
- Run the full test suite to confirm no injection failures.
## 2. javax.servlet → jakarta.servlet
-- Upgrade `jakarta.servlet:jakarta.servlet-api` from `4.x` (transitional) to `6.0.0` (true Jakarta namespace).
+- Upgrade `killbill-jooby` to Jetty 11 and move its servlet/jetty adapter code to `jakarta.servlet`.
+- Upgrade the remaining `jakarta.servlet:jakarta.servlet-api` users from `4.x` (transitional) to a true Jakarta namespace line when their integration layers are ready.
- In all Java source files, replace `import javax.servlet.*` with `import jakarta.servlet.*`.
- - Affected modules: `skeleton` (8 files), `metrics` (4 files), and `killbill-jooby` (forked Jooby servlet/jetty source under `org.jooby.servlet`/`org.jooby.jetty` packages).
+ - Completed in-repo for `killbill-jooby`, `skeleton`, and `metrics`.
- Affected classes: `HttpServlet`, `ServletContext`, `Filter`, `FilterChain`, `HttpServletRequest`, `HttpServletResponse`, etc.
- Update `GuiceServletContextListener` and `JULServletContextListener` to use `jakarta.servlet` equivalents.
-- Note: `guice-servlet` 6.0 still uses `javax.servlet` — this creates a temporary incompatibility.
- - Workaround: keep `guice-servlet` on 6.0 and defer `skeleton`/`metrics` servlet migration until Phase 3 / Step 4 (Guice 7.0).
- - Alternative: migrate `skeleton` servlet code and `guice-servlet` together in Phase 3 / Step 4.
+- Current state: completed in-repo via Guice Servlet **7.0.0**, Jetty **11.0.24**, `jakarta.servlet-api:5.0.0`, and source/test migration from `javax.servlet.*` to `jakarta.servlet.*` in `killbill-jooby`, `skeleton`, and `metrics`.
## 3. javax.ws.rs → jakarta.ws.rs + Jersey 3.x (skeleton only)
-- Upgrade `jakarta.ws.rs:jakarta.ws.rs-api` from `2.x` (transitional) to `3.1.0` (true Jakarta namespace).
+- Upgrade `jakarta.ws.rs:jakarta.ws.rs-api` from `2.x` (transitional) to a true Jakarta namespace line.
- In all Java source files, replace `import javax.ws.rs.*` with `import jakarta.ws.rs.*`.
- - Affected module: `skeleton` only (6 files).
+ - Completed in-repo for `skeleton`.
- Affected annotations: `@Path`, `@GET`, `@POST`, `@Produces`, `@Consumes`, `@QueryParam`, `@PathParam`, etc.
- Upgrade Jersey from **2.39.1 to 3.x** (Jersey 3.x uses `jakarta.ws.rs`).
- - Update all `org.glassfish.jersey.*` dependencies to their 3.x equivalents.
- - Update `org.glassfish.hk2:guice-bridge` and `hk2-api` to Jakarta-compatible versions.
+ - Completed in-repo with Jersey **3.0.18** and HK2 / `guice-bridge` **3.0.6**.
+ - Updated the Jackson JAX-RS provider to `com.fasterxml.jackson.jakarta.rs:jackson-jakarta-rs-json-provider`.
- Run skeleton tests (`TestJerseyBaseServerModule`) to verify Jersey 3.x + Jakarta JAX-RS works.
## 4. Upgrade to Guice 7.0.0 (Final Jakarta)
@@ -247,7 +242,7 @@
- This step MUST come after Phase 2 / Step 2 and the earlier Jakarta migration steps in this phase are complete.
- Update `killbill-oss-parent` to use `com.google.inject:guice:7.0.0`.
- Update `com.google.inject.extensions:guice-servlet` to `7.0.0` (now uses `jakarta.servlet`).
- - This resolves the `guice-servlet` / `jakarta.servlet` incompatibility noted above.
+ - Completed in-repo via root dependency management override to Guice / Guice Servlet **7.0.0**.
- Verify no transitive dependency still pulls in `javax.inject` or `javax.servlet` (use `mvn dependency:tree`).
- Run the full test suite to confirm everything works with Guice 7.0.0.
@@ -260,12 +255,13 @@
- Update JAXB runtime implementation (e.g., `org.glassfish.jaxb:jaxb-runtime`) to 4.x.
- Run automaton and xmlloader tests to verify XML serialization/deserialization still works.
- This step is independent of Guice and can be done in parallel with the earlier Jakarta migration work.
+- Current state: completed in-repo via `jakarta.xml.bind-api:4.0.0`, `jaxb-runtime:4.0.0`, and source/test import updates in `automaton` and `xmlloader`.
---
# Phase 4 — Continue Modernizing the Existing killbill-jooby Fork
-> With the codebase fully on Jakarta (Phase 3), keep the existing `killbill-jooby`
+> With the targeted Jakarta migration complete for the framework-facing APIs (Phase 3), keep the existing `killbill-jooby`
> fork based on upstream Jooby 1.6.9 and continue modernizing it in place.
> This is fork maintenance, not a re-fork onto a newer upstream major version.
@@ -279,6 +275,7 @@
- Re-verify Kill Bill-specific changes documented in `jooby/CHANGES.md` and keep them applied on top of the maintained fork.
- Update `jooby/README.md` and `jooby/CHANGES.md` to reflect the current maintained-fork baseline and any new compatibility notes.
- Run `mvn clean install` to verify compilation and tests pass.
+- Current state: effectively complete in-repo. The maintained fork remains based on Jooby **1.6.9**, stays vendored in place, uses the existing Kill Bill module layout and test tree, runs on Jetty **11.0.24** / Servlet **5.0.0**, and no longer has direct `javax.annotation` usage.
---
@@ -303,6 +300,28 @@
---
+# Phase 6 — Parent Dependency Alignment
+
+> Once the Jakarta-era dependency baselines are proven inside `killbill-commons`, move the stable
+> version pins into `killbill-oss-parent` so this repository stops carrying local overrides that
+> should become platform defaults.
+
+## 1. Promote Jetty 11 / Servlet 5 properties to killbill-oss-parent
+
+- Add parent-managed `jetty.version` for the validated Jooby baseline (**11.0.24** or later agreed patch line).
+- Add parent-managed `jakarta.servlet-api.version` for the validated Jakarta Servlet baseline (**5.0.0** or later agreed line).
+- Update `killbill-oss-parent` dependency management so child modules can inherit these versions consistently.
+- Remove the local `jetty.version` and `jakarta.servlet-api.version` properties from child modules once the parent provides them.
+- Verify `killbill-commons` still builds and tests cleanly when Jooby inherits those properties from `killbill-oss-parent`.
+- Verify downstream Kill Bill repositories that consume Jetty / Servlet APIs remain compatible with the new parent-managed baseline.
+
+## 2. Promote later Jakarta-era dependency baselines to killbill-oss-parent
+
+- As Phase 3 and Phase 4 complete, move any other repository-local dependency overrides that should become platform defaults into `killbill-oss-parent`.
+- Keep this limited to versions that are already validated in `killbill-commons`; do not move experimental baselines into the parent prematurely.
+
+---
+
# Cross-Cutting Concerns (All Phases)
## 1. Process & Verification Guidelines
From 53cb80ab5fe16ea81afcb55a9268ce47ccf09875 Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 02:54:28 +0700
Subject: [PATCH 11/15] jooby: fix/update various tests
---
.../commons/concurrent/TestExecutors.java | 50 ++++++++++++++-----
.../killbill/commons/utils/TestTypeToken.java | 49 +++++++++++++++---
2 files changed, 79 insertions(+), 20 deletions(-)
diff --git a/concurrent/src/test/java/org/killbill/commons/concurrent/TestExecutors.java b/concurrent/src/test/java/org/killbill/commons/concurrent/TestExecutors.java
index c67d5383..e56a087c 100644
--- a/concurrent/src/test/java/org/killbill/commons/concurrent/TestExecutors.java
+++ b/concurrent/src/test/java/org/killbill/commons/concurrent/TestExecutors.java
@@ -39,6 +39,10 @@
@Test(singleThreaded = true)
public class TestExecutors {
+ // JDK 21 changed Thread.toString() to include the numeric thread id and extra metadata.
+ // These tests only care that the executor thread name is present, not the JVM-specific prefix.
+ private static final String TEST_EXECUTOR_THREAD_PATTERN = "Thread\\[[^\\]]*TestLoggingExecutor-[^\\]]+\\]";
+
private void registerAppenders(final Logger loggingLogger, final Logger failsafeLogger, final WriterAppender dummyAppender) {
dummyAppender.setImmediateFlush(true);
loggingLogger.setLevel(Level.DEBUG);
@@ -103,8 +107,10 @@ public void run() {
final String actual = bos.toString();
- assertPattern(actual, Pattern.compile("ERROR - Thread\\[TestLoggingExecutor-[^\\]]+\\] ended abnormally with an exception\r?\njava.lang.RuntimeException: Fail!\r?\n"));
- assertPattern(actual, Pattern.compile("DEBUG - Thread\\[TestLoggingExecutor-[^\\]]+\\] finished executing$"));
+ // Match the log severity/message/exception content while tolerating both pre-JDK-21 and
+ // JDK-21+ thread string formats.
+ assertPattern(actual, exceptionLogPattern("ERROR", "ended abnormally with an exception", "java.lang.RuntimeException: Fail!"));
+ assertPattern(actual, finishedExecutingPattern());
}
private void errorTest(final ExecutorService executorService) throws Exception {
@@ -124,8 +130,10 @@ public void run() {
final String actual = bos.toString();
- assertPattern(actual, Pattern.compile("ERROR - Thread\\[TestLoggingExecutor-[^\\]]+\\] ended abnormally with an exception\r?\njava.lang.OutOfMemoryError: Poof!\r?\n"));
- assertPattern(actual, Pattern.compile("DEBUG - Thread\\[TestLoggingExecutor-[^\\]]+\\] finished executing$"));
+ // Keep this assertion focused on the wrapped error logging rather than the exact
+ // Thread.toString() rendering chosen by the current JDK.
+ assertPattern(actual, exceptionLogPattern("ERROR", "ended abnormally with an exception", "java.lang.OutOfMemoryError: Poof!"));
+ assertPattern(actual, finishedExecutingPattern());
}
private void callableTest(final ExecutorService executorService) throws Exception {
@@ -168,9 +176,11 @@ public Void call() throws Exception {
final String actual = bos.toString();
- assertPattern(actual, Pattern.compile("DEBUG - Thread\\[TestLoggingExecutor-[^\\]]+\\] ended with an exception\r?\njava.lang.Exception: Oops!\r?\n"));
- assertPattern(actual, Pattern.compile("ERROR - Thread\\[TestLoggingExecutor-[^\\]]+\\] ended with an exception\r?\njava.lang.OutOfMemoryError: Uh oh!\r?\n"));
- assertPattern(actual, Pattern.compile("DEBUG - Thread\\[TestLoggingExecutor-[^\\]]+\\] finished executing$"));
+ // Callable logging uses DEBUG for checked exceptions and ERROR for Errors; the helper keeps
+ // that semantic assertion stable across JDK thread formatting changes.
+ assertPattern(actual, exceptionLogPattern("DEBUG", "ended with an exception", "java.lang.Exception: Oops!"));
+ assertPattern(actual, exceptionLogPattern("ERROR", "ended with an exception", "java.lang.OutOfMemoryError: Uh oh!"));
+ assertPattern(actual, finishedExecutingPattern());
}
private void scheduledTest(final ScheduledExecutorService executorService) throws Exception {
@@ -239,12 +249,26 @@ public void run() {
final String actual = bos.toString();
- assertPattern(actual, Pattern.compile("ERROR - Thread\\[TestLoggingExecutor-[^\\]]+\\] ended abnormally with an exception\r?\njava.lang.RuntimeException: D'oh!\r?\n"));
- assertPattern(actual, Pattern.compile("ERROR - Thread\\[TestLoggingExecutor-[^\\]]+\\] ended abnormally with an exception\r?\njava.lang.OutOfMemoryError: Zoinks!\r?\n"));
- assertPattern(actual, Pattern.compile("ERROR - Thread\\[TestLoggingExecutor-[^\\]]+\\] ended abnormally with an exception\r?\njava.lang.RuntimeException: Eep!\r?\n"));
- assertPattern(actual, Pattern.compile("ERROR - Thread\\[TestLoggingExecutor-[^\\]]+\\] ended abnormally with an exception\r?\njava.lang.OutOfMemoryError: Zounds!\r?\n"));
- assertPattern(actual, Pattern.compile("ERROR - Thread\\[TestLoggingExecutor-[^\\]]+\\] ended abnormally with an exception\r?\njava.lang.RuntimeException: Egad!\r?\n"));
- assertPattern(actual, Pattern.compile("DEBUG - Thread\\[TestLoggingExecutor-[^\\]]+\\] finished executing$"));
+ // Scheduled executors emit several wrapped failures; use the shared helper so each
+ // assertion still verifies the exact throwable/message without depending on thread ids.
+ assertPattern(actual, exceptionLogPattern("ERROR", "ended abnormally with an exception", "java.lang.RuntimeException: D'oh!"));
+ assertPattern(actual, exceptionLogPattern("ERROR", "ended abnormally with an exception", "java.lang.OutOfMemoryError: Zoinks!"));
+ assertPattern(actual, exceptionLogPattern("ERROR", "ended abnormally with an exception", "java.lang.RuntimeException: Eep!"));
+ assertPattern(actual, exceptionLogPattern("ERROR", "ended abnormally with an exception", "java.lang.OutOfMemoryError: Zounds!"));
+ assertPattern(actual, exceptionLogPattern("ERROR", "ended abnormally with an exception", "java.lang.RuntimeException: Egad!"));
+ assertPattern(actual, finishedExecutingPattern());
+ }
+
+ // Build the regex from the stable log semantics and allow either legacy or JDK 21+ thread
+ // renderings; \R keeps the assertion platform-neutral for line endings too.
+ private Pattern exceptionLogPattern(final String level, final String message, final String throwable) {
+ return Pattern.compile(Pattern.quote(level + " - ") + TEST_EXECUTOR_THREAD_PATTERN + Pattern.quote(" " + message) + "\\R" + Pattern.quote(throwable) + "\\R");
+ }
+
+ // Same rationale as exceptionLogPattern: verify the message, but ignore JVM-specific thread
+ // formatting details that changed in Java 21.
+ private Pattern finishedExecutingPattern() {
+ return Pattern.compile(Pattern.quote("DEBUG - ") + TEST_EXECUTOR_THREAD_PATTERN + Pattern.quote(" finished executing") + "$");
}
private void assertPattern(final String actual, final Pattern expected) {
diff --git a/utils/src/test/java/org/killbill/commons/utils/TestTypeToken.java b/utils/src/test/java/org/killbill/commons/utils/TestTypeToken.java
index 50b3a2cc..0bd8baeb 100644
--- a/utils/src/test/java/org/killbill/commons/utils/TestTypeToken.java
+++ b/utils/src/test/java/org/killbill/commons/utils/TestTypeToken.java
@@ -19,6 +19,7 @@
import java.util.ArrayList;
import java.util.Collection;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -35,17 +36,51 @@ public void testGetRawTypes() {
Assert.assertEquals(types.size(), 1);
types = TypeToken.getRawTypes(Integer.class);
- // class java.lang.Integer, interface java.lang.Comparable, class java.lang.Number, interface java.io.Serializable, class java.lang.Object
- // FIXME-1615 : JDK 11 and JDK 17 produce different result.
- // Assert.assertEquals(types.size(), 5);
+ final Set> integerExpected = new LinkedHashSet<>();
+ integerExpected.add(Integer.class);
+ integerExpected.add(Comparable.class);
+ addIfPresent(integerExpected, "java.lang.constant.Constable");
+ addIfPresent(integerExpected, "java.lang.constant.ConstantDesc");
+ integerExpected.add(Number.class);
+ integerExpected.add(java.io.Serializable.class);
+ integerExpected.add(Object.class);
+ Assert.assertEquals(types, integerExpected);
// Guava version: com.google.common.reflect.TypeToken.of(SuperList.class).getTypes().rawTypes() . Size = 11.
types = TypeToken.getRawTypes(SuperList.class);
- Assert.assertEquals(types.size(), 11);
+ final Set> expected = new LinkedHashSet<>();
+ expected.add(SuperList.class);
+ expected.add(ArrayList.class);
+ expected.add(List.class);
+ addIfPresent(expected, "java.util.SequencedCollection");
+ expected.add(Collection.class);
+ expected.add(Iterable.class);
+ expected.add(java.util.RandomAccess.class);
+ expected.add(Cloneable.class);
+ expected.add(java.io.Serializable.class);
+ expected.add(java.util.AbstractList.class);
+ expected.add(java.util.AbstractCollection.class);
+ expected.add(Object.class);
+ Assert.assertEquals(types, expected);
types = TypeToken.getRawTypes(String.class);
- // class java.lang.String, interface java.lang.Comparable, interface java.io.Serializable, interface java.lang.CharSequence, class java.lang.Object
- // FIXME-1615 : JDK 11 and JDK 17 produce different result.
- // Assert.assertEquals(types.size(), 5);
+ final Set> stringExpected = new LinkedHashSet<>();
+ stringExpected.add(String.class);
+ stringExpected.add(java.io.Serializable.class);
+ stringExpected.add(Comparable.class);
+ stringExpected.add(CharSequence.class);
+ addIfPresent(stringExpected, "java.lang.constant.Constable");
+ addIfPresent(stringExpected, "java.lang.constant.ConstantDesc");
+ stringExpected.add(Object.class);
+ Assert.assertEquals(types, stringExpected);
+ }
+
+ // Newer JDKs add interfaces such as SequencedCollection/Constable/ConstantDesc, so the test
+ // builds the exact expected set while remaining compatible with earlier runtimes that lack them.
+ private void addIfPresent(final Set> types, final String className) {
+ try {
+ types.add(Class.forName(className));
+ } catch (final ClassNotFoundException ignored) {
+ }
}
}
From 644738794a090d4535989e91d6200a8b9ddc1bf2 Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 02:56:00 +0700
Subject: [PATCH 12/15] jooby: force maven-enforcer-plugin to align with
supported JDK version
---
pom.xml | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index dde51fbf..5e27b260 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,8 +66,11 @@
true
- 17
+ 21
-Xmx${build.jvmsize} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED
+
+ 1.12.0
7.0.0
@@ -274,4 +277,21 @@
+
+
+
+ org.apache.maven.plugins
+ maven-enforcer-plugin
+
+
+
+ org.codehaus.mojo
+ extra-enforcer-rules
+ ${extra-enforcer-rules.version}
+
+
+
+
+
From 686ddc7cd911d03d2c731bc06e986278ea7a5303 Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 02:56:38 +0700
Subject: [PATCH 13/15] jooby: update CI shared branch from main to java21
---
.github/workflows/ci.yml | 2 +-
.github/workflows/cloudsmith_release.yml | 2 +-
.github/workflows/codeql-analysis.yml | 2 +-
.github/workflows/snapshot.yml | 2 +-
.github/workflows/sync.yml | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 2f25a3f1..0e2a9a3b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -7,6 +7,6 @@ on:
jobs:
ci:
- uses: killbill/gh-actions-shared/.github/workflows/ci.yml@main
+ uses: killbill/gh-actions-shared/.github/workflows/ci.yml@java21
with:
test-profile-matrix: '[ "travis", "mysql", "postgresql", "jdbi", "config-magic" ]'
diff --git a/.github/workflows/cloudsmith_release.yml b/.github/workflows/cloudsmith_release.yml
index 143cfc81..da426bba 100644
--- a/.github/workflows/cloudsmith_release.yml
+++ b/.github/workflows/cloudsmith_release.yml
@@ -5,7 +5,7 @@ on:
jobs:
cloudsmith_release:
- uses: killbill/gh-actions-shared/.github/workflows/cloudsmith_release.yml@main
+ uses: killbill/gh-actions-shared/.github/workflows/cloudsmith_release.yml@java21
with:
group_id: org.kill-bill.commons
secrets:
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index c1506847..b8add174 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -7,4 +7,4 @@ on:
jobs:
analyze:
- uses: killbill/gh-actions-shared/.github/workflows/codeql-analysis.yml@main
+ uses: killbill/gh-actions-shared/.github/workflows/codeql-analysis.yml@java21
diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml
index ad45d253..cd51d668 100644
--- a/.github/workflows/snapshot.yml
+++ b/.github/workflows/snapshot.yml
@@ -6,7 +6,7 @@ on:
jobs:
snapshot:
- uses: killbill/gh-actions-shared/.github/workflows/snapshot.yml@main
+ uses: killbill/gh-actions-shared/.github/workflows/snapshot.yml@java21
secrets:
MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml
index 724801ae..f044f851 100644
--- a/.github/workflows/sync.yml
+++ b/.github/workflows/sync.yml
@@ -7,6 +7,6 @@ on:
jobs:
sync:
- uses: killbill/gh-actions-shared/.github/workflows/sync.yml@main
+ uses: killbill/gh-actions-shared/.github/workflows/sync.yml@java21
secrets:
CREATE_PULL_REQUEST_SSH_KEY: ${{ secrets.CREATE_PULL_REQUEST_SSH_KEY }}
From 5e0bab041889077124b989c6c2af043a47c7bd38 Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 03:30:01 +0700
Subject: [PATCH 14/15] jooby: nit - reorganize dependencies
---
pom.xml | 85 ++++++++++++++++++++++++++----------------------
skeleton/pom.xml | 10 +++---
2 files changed, 52 insertions(+), 43 deletions(-)
diff --git a/pom.xml b/pom.xml
index 5e27b260..221064ce 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,42 +66,51 @@
true
- 21
- -Xmx${build.jvmsize} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED
1.12.0
7.0.0
-
- 2.0.1
-
- 5.0.0
3.0.6
-
- 11.0.24
+
+ 2.13.4
+
+ 2.1.0
2.1.1
+
+ 2.0.1
+
+ 5.0.0
3.0.2
3.0.0
- 3.0.18
-
- 2.13.4
-
3.30.2-GA
- 2.1.0
-
4.0.0
4.0.0
+
+ 3.0.18
+
+ 11.0.24
+ 21
+
+ 4.9.8.3
+ -Xmx${build.jvmsize} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED
+
+ com.fasterxml.jackson.jakarta.rs
+ jackson-jakarta-rs-json-provider
+ ${jackson.jakarta.rs.version}
+
com.google.inject
guice
@@ -112,25 +121,35 @@
guice-servlet
${guice.version}
+
+ jakarta.activation
+ jakarta.activation-api
+ ${jakarta.activation-api.version}
+
jakarta.inject
jakarta.inject-api
${jakarta.inject-api.version}
- com.fasterxml.jackson.jakarta.rs
- jackson-jakarta-rs-json-provider
- ${jackson.jakarta.rs.version}
+ jakarta.xml.bind
+ jakarta.xml.bind-api
+ ${jaxb-api.version}
- jakarta.activation
- jakarta.activation-api
- ${jakarta.activation-api.version}
+ org.eclipse.jetty
+ jetty-alpn-server
+ ${jetty.version}
- jakarta.xml.bind
- jakarta.xml.bind-api
- ${jaxb-api.version}
+ org.eclipse.jetty.http2
+ http2-server
+ ${jetty.version}
+
+
+ org.eclipse.jetty.websocket
+ websocket-jetty-api
+ ${jetty.version}
org.glassfish.jaxb
@@ -149,21 +168,6 @@
javassist
${javassist.version}
-
- org.eclipse.jetty.http2
- http2-server
- ${jetty.version}
-
-
- org.eclipse.jetty
- jetty-alpn-server
- ${jetty.version}
-
-
- org.eclipse.jetty.websocket
- websocket-jetty-api
- ${jetty.version}
-
org.kill-bill.commons
killbill-automaton
@@ -279,6 +283,11 @@
+
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ ${spotbugs-maven-plugin.version}
+
org.apache.maven.plugins
maven-enforcer-plugin
diff --git a/skeleton/pom.xml b/skeleton/pom.xml
index cd276938..ff8bd2a4 100644
--- a/skeleton/pom.xml
+++ b/skeleton/pom.xml
@@ -73,6 +73,11 @@
metrics-core
test
+
+ jakarta.inject
+ jakarta.inject-api
+ provided
+
jakarta.servlet
jakarta.servlet-api
@@ -82,11 +87,6 @@
jakarta.ws.rs
jakarta.ws.rs-api
-
- jakarta.inject
- jakarta.inject-api
- provided
-
joda-time
joda-time
From 9a3703f5398310abcb7433c266e43cbfa8e205c6 Mon Sep 17 00:00:00 2001
From: xsalefter
Date: Sat, 11 Apr 2026 03:33:55 +0700
Subject: [PATCH 15/15] jooby: update various spotbugs-exclude.xml
---
.../java/org/skife/config/DataAmount.java | 2 +-
.../main/java/org/skife/config/TimeSpan.java | 2 +-
jdbi/spotbugs-exclude.xml | 26 +++++++++++++++++++
jooby/spotbugs-exclude.xml | 15 +++++++++++
4 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/config-magic/src/main/java/org/skife/config/DataAmount.java b/config-magic/src/main/java/org/skife/config/DataAmount.java
index 3c74039b..81ba105c 100644
--- a/config-magic/src/main/java/org/skife/config/DataAmount.java
+++ b/config-magic/src/main/java/org/skife/config/DataAmount.java
@@ -20,7 +20,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-public class DataAmount {
+public final class DataAmount {
private static final Pattern SPLIT = Pattern.compile("^(\\d+)\\s*([a-zA-Z]+)$");
private static final Pattern NUM_ONLY = Pattern.compile("^(\\d+)$");
diff --git a/config-magic/src/main/java/org/skife/config/TimeSpan.java b/config-magic/src/main/java/org/skife/config/TimeSpan.java
index f8b84ccf..85d94089 100644
--- a/config-magic/src/main/java/org/skife/config/TimeSpan.java
+++ b/config-magic/src/main/java/org/skife/config/TimeSpan.java
@@ -22,7 +22,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-public class TimeSpan {
+public final class TimeSpan {
private static final Pattern SPLIT = Pattern.compile("^(\\d+)\\s?(\\w+)$");
private static final HashMap UNITS = new HashMap();
diff --git a/jdbi/spotbugs-exclude.xml b/jdbi/spotbugs-exclude.xml
index d76a97a3..f62da984 100644
--- a/jdbi/spotbugs-exclude.xml
+++ b/jdbi/spotbugs-exclude.xml
@@ -134,4 +134,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jooby/spotbugs-exclude.xml b/jooby/spotbugs-exclude.xml
index 400960d8..c0d39797 100644
--- a/jooby/spotbugs-exclude.xml
+++ b/jooby/spotbugs-exclude.xml
@@ -119,4 +119,19 @@
+
+
+
+
+
+
+
+
+
+
+
+