build: extract the semantic DOCX/PPTX backend into graph-compose-render-docx#298
Merged
Conversation
…er-docx Split the POI-backed semantic office backend out of the engine jar so the lean core no longer carries Apache POI. - New standalone render-docx/ module (lockstep-versioned with the engine): moves DocxSemanticBackend and the PptxSemanticBackend stub into new format packages document.backend.semantic.docx / .pptx (the SPI — SemanticBackend, SemanticExportContext, SemanticExportManifest — stays in the core document.backend.semantic package; a split package is not allowed). poi-ooxml is a plain compile dependency here. - Root pom drops the <optional> poi-ooxml dependency. The DocumentSession export test that exercised both backends moves to render-docx as SessionSemanticExportTest (the engine test scope can no longer see the backends); its no-poi guard is dropped because POI is always present in this module. - aggregator adds the module; examples depend on graph-compose-render-docx (which brings POI transitively) and WordExportExample imports the new FQN. Reactor build green: render-docx compiles and its docx tests pass, while the root builds POI-free.
Now that Apache POI lives only in graph-compose-render-docx, drop the engine's POI-optional plumbing and register the new module in the release/CI pipeline. - Root pom: remove the now-unused poi.version property and the no-poi profile (the surefire POI-exclusion + no.poi system property) — POI is no longer on the engine classpath, so there is nothing to exclude. - ci.yml: drop the no-poi-suite job; add a graph-compose-render-docx install step to the examples-generation job (the DOCX example resolves the backend there). - publish.yml: deploy graph-compose-render-docx to Central on the v* tag, after the engine (its graph-compose dependency). - cut-release.ps1: bump render-docx/pom.xml in lockstep and add it to the commit staging allow-list. - Reword the DocxSemanticBackend "optional POI" javadoc — POI ships with the module now.
…ards
- CHANGELOG: note graph-compose-render-docx carrying the DOCX/PPTX backend + POI,
the DocxSemanticBackend/PptxSemanticBackend package move, and the retired no-poi
profile.
- docs/recipes/docx-export.md, docs/troubleshooting.md, examples/README.md: point
DOCX consumers at graph-compose-render-docx instead of raw poi-ooxml; fix the
moved-test link and the new import FQN.
- Drop the now-inert @DisabledIfSystemProperty("no.poi") guards (and the
retired-profile javadoc) from the three moved DOCX tests — the no-poi profile
no longer exists.
This was referenced Jul 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
A 2.0 lean-core goal: a consumer that only renders PDF should not pull Apache POI (~10 MB). This extracts the semantic office backend into its own artifact so POI leaves the core entirely — and, being the smallest extraction, it proves the multi-module publish/reactor/release pipeline before the larger render-pdf and templates moves.
What changed
graph-compose-render-docxmodule (standalone pom, lockstep-versioned with the engine).DocxSemanticBackend→document.backend.semantic.docx; thePptxSemanticBackendstub →document.backend.semantic.pptx. The SPI (SemanticBackend,SemanticExportContext,SemanticExportManifest) stays in the coredocument.backend.semanticpackage — the backends move to format sub-packages so there is no split package.poi-ooxmlis a plain compile dependency of this module.<optional>poi-ooxmldependency, the now-unusedpoi.versionproperty, and theno-poiprofile are removed; theno-poiCI job is retired. The oneDocumentSessionexport test that exercised both backends moves to render-docx asSessionSemanticExportTest(the engine test scope can no longer see the backends; its no-poi guard is dropped because POI is always present in this module).aggregatorgains the module;publish.ymldeploys it on thev*tag after the engine (itsgraph-composedependency);cut-release.ps1bumps it in lockstep and adds it to the commit staging allow-list; the examples-generation CI job installs it;examplesdepends ongraph-compose-render-docx(bringing POI transitively) andWordExportExampleimports the new FQN.DocxSemanticBackend/PptxSemanticBackendchange public FQN — a documented 2.0 move; the old→new mapping lands in the 2.0 migration guide.Verification
./mvnw clean verify -pl .— green. The engine builds POI-free; there is zeroorg.apache.poianywhere in the root sources../mvnw -f aggregator/pom.xml verify— green across all modules, including render-docx (its four DOCX tests pass) andexamples(which resolves render-docx from the reactor).