This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch docs
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/docs by this push:
new 3646155bd3 build: add juneau-bom and curated dependency bundles
(jetty/tomcat/springboot)
3646155bd3 is described below
commit 3646155bd315fe2948027522418b905f8253e535
Author: James Bognar <[email protected]>
AuthorDate: Thu Jun 18 15:03:22 2026 -0400
build: add juneau-bom and curated dependency bundles
(jetty/tomcat/springboot)
---
pages/release-notes/10.0.0.md | 32 +++++++++
pages/topics/17.01.DependencyManagement.md | 106 +++++++++++++++++++++++++++++
pages/topics/18.01.StarterProjects.md | 5 ++
sidebars.ts | 12 ++++
4 files changed, 155 insertions(+)
diff --git a/pages/release-notes/10.0.0.md b/pages/release-notes/10.0.0.md
index f9aaa597ea..5920a9aea6 100644
--- a/pages/release-notes/10.0.0.md
+++ b/pages/release-notes/10.0.0.md
@@ -155,6 +155,38 @@ JettySettings jettySettings() {
See the new [Graceful Shutdown & Readiness
Gating](/docs/topics/GracefulShutdown) topic page for details, including the
Jetty/Tomcat parity table and Kubernetes deployment guidance.
+### Build & packaging (BOM + curated bundles)
+
+#### Published BOM + curated dependency bundles
+
+Juneau now publishes a **Bill of Materials** and a small set of **curated
dependency bundles** so consumers can depend on a coherent, version-aligned
slice of the framework without hand-maintaining `<version>` tags — while
keeping Juneau's **explicit-over-magic** configuration model (no Spring-style
classpath auto-configuration).
+
+- **`org.apache.juneau:juneau-bom`** (packaging `pom`) — import it
(`scope=import`, `type=pom`) and drop explicit versions from your Juneau
dependencies. Enumerates the consumer-facing Juneau modules plus the small set
of starter-relevant third-party versions the bundles need (`micrometer-core`,
`opentelemetry-api`, `jakarta.servlet-api`, `jakarta.validation-api`). It is
**not** a whole-world third-party BOM, so it won't collide with a third-party
BOM you import yourself.
+- **Three deployment-shape bundles** (packaging `pom`) — depend on one and
transitively pull a coherent module set plus `juneau-rest-client`:
+ - `juneau-microservice-jetty-bundle`
+ - `juneau-microservice-tomcat-bundle`
+ - `juneau-springboot-bundle`
+
+```xml
+<dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.juneau</groupId>
+ <artifactId>juneau-bom</artifactId>
+ <version>10.0.0</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+</dependencyManagement>
+```
+
+The bundles are **dependency aggregators only** — they register no
configurations and perform no classpath auto-discovery. Configuration
registration stays explicit via
`Microservice.Builder.configurations(Class<?>...)`. This is a deliberate design
choice: per the maintainer, *"I actually see auto-configuration as a weakness
in Spring Boot that leads to applications with long startup times and
impossible-to-understand architectures."* These bundles are also distinct from
the external clo [...]
+
+A reactor-consistency guard (`scripts/check-bom-completeness.py`, wired into
the push gate) fails the build if a published module is missing from the BOM,
so the enumeration can't silently drift. The binary distribution now also
bundles `juneau-microservice-tomcat` (previously omitted).
+
+See the new [Dependency Management (BOM &
Bundles)](/docs/topics/DependencyManagement) topic page for usage and the full
explicit-over-magic rationale.
+
### juneau-petstore (new module family)
Three new modules under a top-level `juneau-petstore/` aggregator together
form the canonical Juneau petstore showcase application. The legacy
`juneau-examples-rest{,-jetty,-springboot,-jetty-ftest}` family of modules has
been retired in this release in favor of the petstore family — see the
**Breaking Changes** section below.
diff --git a/pages/topics/17.01.DependencyManagement.md
b/pages/topics/17.01.DependencyManagement.md
new file mode 100644
index 0000000000..552b8c384c
--- /dev/null
+++ b/pages/topics/17.01.DependencyManagement.md
@@ -0,0 +1,106 @@
+---
+title: "Dependency Management (BOM & Bundles)"
+slug: DependencyManagement
+---
+
+Apache Juneau ships two packaging aids that make it easy to depend on a
coherent, version-aligned slice
+of the framework without hand-maintaining a long list of `<version>` tags:
+
+- A **Bill of Materials (BOM)** — `org.apache.juneau:juneau-bom` — for version
alignment.
+- A small set of curated **dependency bundles** — one per deployment shape —
that transitively pull a
+ coherent module set.
+
+Both are deliberately **dependency-only** aids. They register nothing and
discover nothing at runtime
+(see [Explicit over magic](#explicit-over-magic-no-auto-configuration) below).
+
+## The BOM
+
+Import `juneau-bom` (scope `import`, type `pom`) in your
`<dependencyManagement>` and then drop the
+explicit versions from every Juneau dependency — the BOM supplies them:
+
+```xml
+<dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.juneau</groupId>
+ <artifactId>juneau-bom</artifactId>
+ <version>10.0.0</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+</dependencyManagement>
+
+<dependencies>
+ <!-- No <version> needed - the BOM aligns it. -->
+ <dependency>
+ <groupId>org.apache.juneau</groupId>
+ <artifactId>juneau-marshall</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.juneau</groupId>
+ <artifactId>juneau-rest-server</artifactId>
+ </dependency>
+</dependencies>
+```
+
+The BOM enumerates the **consumer-facing** Juneau modules (juneau-core
marshalling/config, juneau-rest,
+juneau-microservice, juneau-bean, juneau-sc). It excludes
internal/test/aggregate artifacts
+(`juneau-test-utils`, `juneau-shaded/*`, `juneau-examples`, `juneau-petstore`,
`juneau-distrib`).
+
+Beyond Juneau's own modules, the BOM also pins the small set of
starter-relevant third-party versions the
+bundles need to stay coherent — `micrometer-core`, `opentelemetry-api`,
`jakarta.servlet-api`, and
+`jakarta.validation-api`. It is **not** a whole-world third-party BOM (unlike
Spring Boot's), so it won't
+collide with a third-party BOM you import yourself.
+
+## The bundles
+
+Each bundle is a `pom`-packaged aggregator for one deployment shape. Depend on
a single bundle and you
+transitively pull a coherent module set plus the REST client:
+
+| Bundle | Deployment shape | Pulls (transitively) |
+| --- | --- | --- |
+| `juneau-microservice-jetty-bundle` | Embedded-Jetty microservice |
`juneau-microservice-jetty` → `juneau-microservice` + `juneau-rest-server`,
plus `juneau-rest-client` |
+| `juneau-microservice-tomcat-bundle` | Embedded-Tomcat microservice |
`juneau-microservice-tomcat` → `juneau-microservice` + `juneau-rest-server`,
plus `juneau-rest-client` |
+| `juneau-springboot-bundle` | Spring Boot bridge |
`juneau-rest-server-springboot` (brings `juneau-rest-server` +
`spring-boot-starter-web`), plus `juneau-rest-client` |
+
+```xml
+<dependency>
+ <groupId>org.apache.juneau</groupId>
+ <artifactId>juneau-microservice-jetty-bundle</artifactId>
+ <version>10.0.0</version>
+ <type>pom</type>
+</dependency>
+```
+
+The bundles internally import `juneau-bom`, so the modules they pull are
already version-aligned.
+
+> **Bundle vs. starter.** These `*-bundle` POMs are *dependency aggregators* —
add one dependency, get a
+> coherent module set. They are not to be confused with the external
clone-and-go
+> [starter project repos](/docs/topics/StarterProjects)
(`juneau-microservice-*-starter`), which are full
+> runnable project templates.
+
+## Explicit over magic (no auto-configuration)
+
+A bundle gives you the *classpath* for a deployment shape. It does **not**
wire anything up for you. Juneau
+keeps configuration registration **explicit** — you register your
configuration classes yourself through
+`Microservice.Builder.configurations(Class<?>...)`. There is no
`ServiceLoader` / `META-INF/services`
+scan and no `@ConditionalOnClass`-style classpath auto-discovery that decides
what to activate based on
+what happens to be on the classpath.
+
+This is a deliberate design choice, not a missing feature. In the maintainer's
words:
+
+> *"No, we want an explicit classpath-driven solution. I actually see
auto-configuration as a weakness in
+> Spring Boot that leads to applications with long startup times and
impossible-to-understand
+> architectures. We should make this distinction clear in our docs."*
+
+The two costs called out there are exactly what the explicit model avoids:
+
+- **Startup time.** No classpath scanning for conditional configuration to
evaluate at boot. What you
+ register is what runs.
+- **Comprehensibility.** The set of active configurations is the literal list
you passed to
+ `configurations(...)` — readable in one place, with no implicit behavior
toggled on by a transitive
+ dependency you didn't realize was present.
+
+So the division of labor is clean: the **BOM** aligns versions, the
**bundles** assemble a coherent
+classpath, and **you** stay in explicit control of what gets wired up.
diff --git a/pages/topics/18.01.StarterProjects.md
b/pages/topics/18.01.StarterProjects.md
index c5e4028a4f..5270e1e639 100644
--- a/pages/topics/18.01.StarterProjects.md
+++ b/pages/topics/18.01.StarterProjects.md
@@ -1,3 +1,8 @@
+---
+title: "Starter Projects"
+slug: StarterProjects
+---
+
# Starter Projects
Apache Juneau provides three minimal, clone-and-go **"Hello World" starter
projects** — one per
diff --git a/sidebars.ts b/sidebars.ts
index 18eec85119..3cedd89034 100644
--- a/sidebars.ts
+++ b/sidebars.ts
@@ -2106,6 +2106,18 @@ const sidebars: SidebarsConfig = {
},
],
},
+ {
+ type: 'category',
+ label: '17. Dependency Management',
+ collapsed: true,
+ items: [
+ {
+ type: 'doc',
+ id:
'topics/17.01.DependencyManagement',
+ label: '17.1.
Dependency Management (BOM & Bundles)',
+ },
+ ],
+ },
{
type: 'category',
label: '18. Starter Projects',