IKE Tooling
IKE Tooling 186
IKE Tooling
Build tooling for the IKE Network: workspace management, release orchestration, gitflow workflows, and build-time utilities.
| Coordinate | Value |
|---|---|
| Group ID | network.ike.tooling |
| Packaging | POM (reactor) |
Modules
| Module | Description |
|---|---|
| IKE Build Standards[1] | Versioned reference material distributed as classified ZIP artifacts: AI-assistant standards, convention documents, shared build configuration, AsciiDoc IDE-preview config, and the workspace scaffold manifest. |
| IKE Workspace Model[2] | Data model and conventions for an IKE workspace. Consumed by both ike-workspace-maven-plugin and ike-maven-plugin so the two plugins share a single source of truth for what a workspace is. Includes the four-state alignment model (snapshot / tag-aligned-release / tag-aligned-checkpoint / external-consumer / unrelated) and graph algorithms for topological ordering. |
| IKE Maven Plugin Support[3] | Shared library used by ike-maven-plugin and ike-workspace-maven-plugin (which lives in ike-platform). Goal-registry helper, base mojo with markdown-report writing, parameter parsing, and released-version resolution. |
| IKE Maven Plugin[4] | The ike:* plugin — release orchestration, scaffolding, site deploy, AsciiDoc rendering, and build-time utilities. ~30 goals. |
Quick Start
The most common single-repo operations:
# Diagnose any in-flight or partial release (read-only)
mvn ike:release-status
# Preview a release (writes a markdown report; no on-disk changes)
mvn ike:release-draft
# Execute a release: tag, deploy to Nexus + komet.sh + gh-pages,
# update latest symlink, push, create GitHub Release
mvn ike:release-publish
# Re-deploy the site for the current release without re-releasing
mvn ike:site-publish
# Apply scaffold convention upgrades (gitignore, hooks, IDE settings)
mvn ike:scaffold-publish
For workspace-spanning operations (ws:* prefix), see the ws plugin docs[5] in ike-platform.
Goal naming convention
Most state-mutating goals come in two forms:
*-draft— preview only. Writes a markdown report, makes no on-disk changes. Safe to run any time.*-publish— executes the action.
The bare goal name (e.g. ike:release) is wired to the draft variant. When you see ike:release-publish written without a matching -draft form, treat the missing suffix as "actually do it."
Release Cascade
[ike-tooling] -> ike-docs -> ike-platform -> { downstream consumers }
ike-tooling releases first because ike-docs and ike-platform declare ike-maven-plugin in their <pluginManagement> and consume ike-maven-plugin-support as a regular dependency. Both must already be resolvable from Nexus when downstream reactors load. The ws:* plugin in ike-platform co-releases with the rest of the platform reactor and references ike-maven-plugin-support from this repo.
The cascade is structurally upstream-first; it is not driven by extension-realm timing. See Design rationale for why no plugin in this repo uses <extensions>true</extensions>.
Design rationale
The plugins in this repo are regular Maven plugins — none of them declares <extensions>true</extensions>, none of them registers a custom packaging type via META-INF/plexus/components.xml, and none of them participates in the Maven build extension realm.
This is a deliberate architectural choice, not an oversight.
Why no extensions
A plugin with <extensions>true</extensions> is loaded into the build extension realm at project-load time — during Maven’s “Scanning for projects” phase, before the Model Builder runs property interpolation. This means the plugin’s <version> in the POM cannot be a ${property}; it must be a literal string.
For a single-repo reactor with one plugin, that constraint is manageable. For our cross-repo cascade (ike-tooling → ike-docs → ike-platform → consumers), it became toxic: every consumer POM had to carry the literal version of every extension plugin from upstream, the literal had to be kept in sync manually across repos, and routine version-property tooling (like ws:align-publish and versions:set-property) was structurally unable to maintain it.
The pain surfaced as IKE-Network/ike-issues#236 — pre-flight release checks repeatedly catching stale literals after upstream releases that the alignment tooling could not see.
Why no custom packaging
The historical reason for <extensions>true</extensions> here was to provide a custom <packaging>ike-doc</packaging> type for documentation modules — a packaging that produces a .zip of AsciiDoc sources as the primary artifact, with a lean lifecycle that skips compile/test phases.
Inspection revealed two problems with that frame:
- The custom packaging produced a primary artifact nobody used. Across 43
<packaging>ike-doc</packaging>modules inike-lab-documents, zero dependencies referenced<type>ike-doc</type>. Consumers exclusively used a parallel<classifier>asciidoc</classifier><type>zip</type>attachment (built bymaven-assembly-pluginfrom the same source directory). Same content, two coordinates, redundant. - Custom packaging cannot serve hybrid modules.
<packaging>is single-valued: a Java module that ships reference docs cannot be bothjarandike-doc. Every comparable docs-as-code project in the JVM ecosystem (Hibernate, Eclipse Collections, Vert.x, Quarkus, OptaPlanner, Apache projects) handles this via classifier attachments for exactly this reason. No project in the surveyed set invents a custom packaging type for documentation.
The architectural decision was therefore to retire <packaging>ike-doc</packaging> in favor of a classifier-canonical shape: <classifier>adoc</classifier><type>zip</type> attached to either a <packaging>pom</packaging> (doc-only) or <packaging>jar</packaging> (hybrid) primary. Activation is path-conditional on src/docs/asciidoc/ existence in ike-parent’s `doc-pipeline profile — not packaging type — so hybrid modules become first-class without per-module ceremony.
Why this is not Spring’s path
A natural objection: most large JVM projects (Spring, Apache projects, Quarkus) publish docs as static sites to gh-pages or CDN-hosted destinations rather than as Maven artifacts. Why not follow that pattern?
Examined point by point, those rationales do not transfer to our context:
- Continuous publication. Maven snapshots provide this —
mvn deployto a snapshot repo on every commit, snapshot semantics handle “latest” natively. - Search-driven discovery. Static URLs are indexable; rsyncing HTML to a public web server downstream of a Maven artifact gives the same indexable URLs.
knowledge.designalready operates this way. - Contributor friction. CI eliminates this — PR merge fires
mvn deployplus a post-deploy hook to rsync rendered output. - CDN economics. Same as search — rsync to CDN works regardless of canonical-storage format.
What honestly remains as a non-Maven argument:
- Antora as a turnkey product. It does cross-version aggregation, theming, navigation, and CDN-friendly output as one coherent thing. Adopt Antora and you do not build any of that. Does not apply here — we have already built the equivalent pipeline (
ike-parent’s render profiles, the Prince/FOP/XEP chains, `knowledge.designrsync deploy, the asciidoctor toolchain). - ASF organizational policy. Apache projects cannot publish docs as Maven artifacts and call it done. A foundation rule, not an engineering reason. Does not apply outside ASF.
- Path dependency. Spring 1.0 shipped in 2003-04, before Maven Central was a viable documentation distribution channel. Spring’s current pipeline descends from choices that were rational then and are too costly to rip out now. Explains why-they-still-do-it but does not justify what a new project would choose today.
For our constraints — small team, cross-repo doc dependencies via topic libraries, an already-built rendering pipeline, and a standing commitment to artifact uniformity — staying inside the Maven artifact ecosystem is the rigorous choice. Every shipped artifact, code or documentation, goes through one pipeline: signed (Bouncy Castle GPG), versioned, deployed to Nexus, mirrorable, and reproducibly buildable years later. We hold every output to the same engineering standard — consistent signing, consistent distribution, consistent build lifecycle, consistent version control. The single-pipeline discipline is the standard we are protecting; uniformity across artifact classes is the point.
The classifier-canonical shape is fully Maven-canonical — it deploys to Nexus, signed, versioned. The choice between custom packaging and classifier is not a Maven-vs-non-Maven choice; both stay inside the Maven ecosystem. Custom packaging was buying an aesthetic type-system marker; classifier-canonical buys a single mechanism that handles doc-only and hybrid uniformly.
Tracking
IKE-Network/ike-issues#321— primary tracking issue (umbrella); subsumes #220, #236, #320.IKE-Network/ike-issues#216— repo split that established the cross-repo boundary the extension realm was working around.- Design note:
dev-classifier-canonical-doc-shapeinike-lab-documents/topics/(full Socratic discovery captured for posterity).
Resources
| Resource | URL |
|---|---|
| GitHub | https://github.com/IKE-Network/ike-tooling[6] |
| Issues | https://github.com/IKE-Network/ike-issues[7] |
| Nexus Artifacts | https://nexus.tinkar.org[8] |
| IKE Network | https://ike.network[9] |