Release Notes — eXist-db 7.0.0-beta3
NOTE Mac
DMGand winexeinstallers are signed but not yet working.
Overview
We are pleased to announce the 7.0.0-beta3 release of eXist-db, representing 3,457 commits by 23 contributors since eXist-6.4.1, with 1,115 merged pull requests closing 299 issues.
This is a major version bump reflecting substantial infrastructure changes, breaking compatibility improvements, and significant W3C conformance work. Users migrating from any 6.x.x release should carefully review the breaking changes below.
Note: This is a beta release — not recommended for production use. Given the large number of breaking changes (Java 21, Jetty 12, XML:DB API 2.0, Lucene 10, and several behavioural changes), we are releasing this beta to gather feedback from the community before the final 7.0.0 release. We have tested extensively but invite all users to report both positive and negative experiences. As always, please ensure you have frequent and correct backups of your database.
For users of our existdb/existdb container images, please note that the moving tag :release now points to this beta. The last v6 tag is :6.4.1 depending on your use case you might need to adjust your automation pipelines.
Breaking Changes
Java 21 Required
eXist-db 7.0.0 requires Java 21 or later. Java 8 through 20 are no longer supported. The build and runtime have been updated accordingly including migration to ZGC as the default garbage collector.
On JDK 21+, the jdk.incubator.vector module is available for SIMD-accelerated vector operations in Lucene's vectorized code paths, powered by the Panama Vector API.
Jetty 12 (Jakarta EE 10 / Servlet 6.0)
Upgraded from Jetty 11 to Jetty 12.0.x with Jakarta EE 10 (Servlet 6.0). This introduces a breaking API change — all javax.servlet namespace references have been migrated to jakarta.servlet. Third-party Java extensions and applications compiled against the previous servlet API will need to be updated.
XML:DB API 2.0
Upgraded to XML:DB API 2.0.0, which uses Jakarta EE 9+ namespace (javax.xml.xmldb → package updates). Existing Java clients using the XML:DB API must be recompiled against the new version.
Secure XML Processing Enabled by Default
Secure XML processing (XML parsing with external entity expansion disabled) is now the default configuration (parser.secure-processing=true in conf.xml). Previously this was opt-in. Applications relying on DOCTYPE-based entity expansion or external DTD fetching must explicitly enable these in their configuration.
XML Declaration Preservation (On-Disk Format Change)
XML declarations (e.g., <?xml version="1.0" encoding="UTF-8"?>) are now persisted and serialized by default. This changes the on-disk storage format. A full backup and restore is required when migrating from 6.x.x. The REST API, Java Admin Client, and WebDAV endpoints all default to preserving the original XML declaration. New query parameters _omit-xml-declaration and _omit-original-xml-declaration provide fine-grained control.
fn:collection Spec Compliance
The fn:collection function signature has been made compliant with the XQuery 3.1 F&O specification. The xmldb:xcollection function has been re-aligned accordingly. Code using non-standard argument patterns may break.
map:merge Use-First Default
map:merge now uses the first occurrence of duplicate keys (per the XQuery 3.1 specification), rather than the last. This is a behavioral change — code relying on the previous "last wins" semantics must be reviewed.
Default Order for Empty Sequences: "Empty Least"
The implementation-defined behavior for ordering empty sequences has changed from "empty greatest" to "empty least", aligning with Saxon and BaseX. Queries with order by that assume empty values sort to the end may produce different results.
Cardinality Enforcement
Stricter enforcement of cardinality in function signatures and type checking has been introduced. Previously permissive handling of sequences where single items were expected may now raise errors.
Legacy JSON Utilities Removed
The deprecated json.xq and jsonp.xq library modules have been deleted. Code using these should migrate to fn:json-to-xml, fn:xml-to-json, or the JSON serialization support built into eXist-db's adaptive serializer.
IPrange Filter Removed
The IP address range filter has been removed from the distribution. Existing configurations referencing this filter will need to be updated.
EXPath HTTP Client Namespace Prefix Alignment
The default EXPath HTTP Client namespace prefix has been aligned with the specification. Existing code using custom prefixes should continue to work, but reliance on the old default may require updates.
JAXB 4 Upgrade
Upgraded from JAXB 3 to JAXB 4 (Jakarta XML Binding). Java code compiled against JAXB 3 will require recompilation.
Deprecated Cardinality._MANY
The Cardinality._MANY constant has been deprecated. Use Cardinality.ZERO_OR_MORE or Cardinality.ONE_OR_MORE as appropriate.
Lucene Analyzer & Query Parser Classes (collection.xconf)
Existing collection.xconf files may reference obsolete Lucene classes that have been removed or relocated:
org.apache.lucene.queryparser.analyzing.AnalyzingQueryParser— removed in Lucene 7.x; omit the<parser>element to use the default parser, or reference a current Lucene 10 query parser classorg.apache.lucene.queryParser.*(capital P) — package renamed to lowercase; update toorg.apache.lucene.queryparser.*org.apache.lucene.analysis.util.*— moved toorg.apache.lucene.analysis.*org.apache.lucene.analysis.standard.StandardFilter/StandardFilterFactory— removed (no-op)org.apache.lucene.util.Version— removed; analyzer constructors no longer accept a Version argumentorg.exist.indexing.lucene.analyzers.NoDiacriticsStandardAnalyzer— removed; useorg.apache.lucene.analysis.standard.StandardAnalyzerinstead
See the Lucene 10 Migration Guide for details.
Major Features
XQuery W3C Conformance Improvements
- Tumbling Window Expressions — support for the W3C XQuery 3.0 tumbling window clause (via PR #4529)
- Sliding Window Expressions — support for sliding window clauses (via PR #4529)
- Count Expressions — support for the XQuery 3.0
countclause in FLWOR expressions (via PR #4530) - XPath Regex Validation — improved compliance with W3C regex validation including XPath 4.0 lookaround support
fn:contains-token— fixed collation parameter to correctly accept empty sequencefn:unparsed-text— improved conformance, BOM stripping, and security-gatedfile://URI resolutionfn:matches/fn:analyze-string/fn:replace/fn:tokenize— fixed error codes and empty-pattern handling per spec
XQTS compliance
One of the main goals of this release was to push towards full XQuery 3.1 compliance. We now pass over 90% of close to 32 thousand test cases that make up the latest version of the entire test-suite. This is more than 10% of what our current release 6.4.1 passed.
And we plan to improve even further before the main release as there are a couple of low hanging fruits left.
For those of you who like raw stats here is a summary. Both runs were done on the same hardware (MacBookPro M1Max with 32 Gb of hardware) but keep in mind that the spec is not a good performance benchmark and we have seen quite a lot of variance in timings. Overall it is safe to say that even though we now pass more of the tests the overall execution time has gone down significantly.
| exist-db version | Tests | Failures | Errors | Skipped | Success rate | Time |
|---|---|---|---|---|---|---|
| 6.4.1 | 31815 | 4720 | 296 | 1185 | 80,5% | 279.741 |
| 7.0.0-beta | 31815 | 1608 | 134 | 1259 | 90,57% | 155.328 |
Serialization Compliance (W3C)
Major serialization compliance overhaul:
- Spec-compliant DOCTYPE for XHTML/HTML serialization
- HTML5/XHTML5 fragment and DOCTYPE serialization fixes
- HTML5 PI serialization per W3C 3.1 and HTML5 PR2372
- Duplicate
Content-Type/charsetmeta suppression in HTML/XHTML head cdata-section-elementsprefix resolution via static namespacesxmlns=""undeclaration via proper namespace stack in XMLWriter- XML 1.1 namespace undeclaration support in element constructors
- Parameter-document serialization parameter implementation
- Bulk-write and raw-text fast path optimizations for HTML/XML serialization
- JSON and adaptive serializer improvements for W3C compliance
- Improved XQuerySerializer for W3C serialization compliance
Lucene Index Improvements
- Lucene 10 migration — upgraded from Lucene 4 to Lucene 10.3.0, removing all deprecated APIs and obsolete query parser classes
- Vector KNN search — new
KnnFloatVectorField/KnnFloatVectorQuerysupport enabling semantic search via:ft:query-vector($nodes, $vector, $k?)— KNN vector search with optional top-k parameterft:query-field-vector($field, $vector, $k?)— field-scoped vector search- Filter queries, range filters, and facet drill-down combined with vector search
- Vector embedding module (
vector:*namespacehttp://exist-db.org/xquery/vector):vector:embed($text, $model, $model-path?, $api-key?)— single-text embeddingvector:embed-batch($texts, $model, $model-path?, $api-key?)— batch embeddingvector:models()— list known embedding modelsvector:diagnostics()— provider status and model cache info
- Embedding providers — ONNX Runtime (local CPU/GPU models) and HTTP providers (OpenAI, Cohere-style APIs)
- Vector store —
vector.dbx(native BFile) for persistent embedding storage, participating in native backup/restore vector-storemodes —db(Lucene +vector.dbx) orlucene(Lucene-only, recomputes from text)- Reindex scopes —
xmldb:reindex($collection, $mode?)with"all","fulltext", or"vector"modes vector-fieldindex config incollection.xconfwithdimension,similarity(cosine/euclidean/dot_product),encoding(base64/text),embedding(local/http),modelandmodel-pathattributes- Optimized memory allocation for
NodePath - Named Lucene field preservation during
xmldb:reindex - Batched delete strategy for collection reindex (tunable via
exist.lucene.reindex.delete.batchClauses, default 256) - Fix facet counts with field queries
- Multiple index configuration search coverage
enforce-index-usedefault set tostrict
Performance Optimizations
- Object lock allocation optimizations (backported from FusionDB)
- Reduced garbage collection pressure from Document/Collection locks
- Path expression optimization in predicates and extension expressions
- Bulk-write serialization paths
FilteredExprandUnionexpression context sequence optimization- Attribute prefix coalescence in XMLWriter
- Caffeine cache configuration with
expireAfterWrite
Build & Infrastructure
- Maven Daemon (mvnd) support for faster CI builds
- Docker: multi-architecture images (x86_64 + arm64)
- Universal binary DMGs for macOS
- XQTS runner 2.0.0 integration with previous-run comparison
- Modernized Maven build and release pipeline
- Codesigning and notarization for macOS DMGs
JMX Monitoring
- Switched from CompositeData to TabularData for Running/Recent Queries, Running Jobs, and Scheduled Jobs — improved interoperability with monitoring tools.
exist:time Pragma
A new and improved exist:time XQuery pragma for timing query execution (backported from FusionDB).
XQSuite Improvements
- Support for additional XDM argument types (including custom assertions)
%test:assertEqualsPermutationfix for argument order- Proper error handling when
effectiveBooleanValuefails - Safe effective boolean value evaluation
- Support for default element namespace
Mail Module
- Authentication support in
mail:get-mail-sessionfunction - Jakarta Mail upgrade
Bundled Packages
- existdb-openapi 0.9.5 (new) — OpenAPI endpoint for eXist-db, providing language-service and cursor namespaces
- roaster 1.12.1 (new) — OpenAPI router for XQuery REST routing
- eXide 4.0.0 — major update modernizing around roaster and existdb-openapi and CodeMirror dependencies
- Monex 5.1.0 — updated for eXist 7 JMX monitoring changes
- exist-documentation 7.0.0 — updated for eXist 7 API changes
- Function documentation (fundocs) 3.0.1 — updated for eXist 7 function signatures
Bug Fixes
- Fix type conversion to Saxon types in
fn:transform(#5882) - Fix
fn:transformURI resolution and global parameter passing - Fix serialization parameter handling for W3C compliance (multiple PRs)
- Fix
PathExpriteration for atomic, context-independent RHS (#798) - Fix
AbstractDateTimeValuesubtype comparisons (#5478) - Fix
RootNodecontext-item dependency - Fix NPE in nested anonymous functions (#5717)
- Fix URL rewrite view pipeline for XHTML-serialized HTML documents
- Fix variable declaration error codes for XQuery 3.1 compliance
- Fix
JettyMaxFormContentSizeconfiguration exposure - Fix
AVLTreeNodeSetitem type tracking for correct return-type checks - Fix XQTS comparison failures: reserved names, context, promotions
- Fix module import resolution and circular imports
- Fix
fn:load-xquery-moduleversion checking - Fix
SequenceTypefunction-arity restriction - Fix XPointer
xmlns()declaration handling in multi-scheme parsing - Fix formatting of small numbers with exponents (#5954)
- Fix JMX servlet startup error (#5835)
- Fix Monex query history key generation (#5881)
- Fix
map:mergeduplicate key handling (use-first per spec) - Fix
util:describe-functionQName output - Fix
InputStream.available()abuse (#4979) - Fix invalid query HTTP response code (500 vs 400) (#4639)
- Fix location hint resolution for relative modules from filesystem
- Fix
CastExpression.toFunctioncardinality (#4971) - Fix tails of
subsequenceoff by one (#4830)
Updated Application Dependencies (compared to eXist-db 6.4.1)
| Dependency | Old Version | New Version |
|---|---|---|
| ANTLR Maven Plugin | 2.3 | 2.4 |
| AppBundler | 2.0.0 | 3.2.0 |
| AspectJ | 1.9.9.1 | 1.25.1 |
| Bouncy Castle | 1.78.1 | 1.84 |
| ByteBuddy | 1.14.x | 1.18.8 |
| Caffeine | 2.9.3 / 3.1.x | 3.2.4 |
| Commons Codec | 1.15 | 1.22.0 |
| Commons Compress | 1.22 | 1.28.0 |
| Commons IO | 2.11.0 | 2.22.0 |
| Commons Lang3 | 3.12.0 | 3.20.0 |
| Fastutil | 8.5.11 | 8.5.18 |
| GeoTools | 32.x / 33.x | 34.4 |
| H2 | 2.1.214 | 2.4.240 |
| IzPack | 5.2.0 | 5.2.5 |
| Jackson | 2.13.4 / 2.15.2 | 2.21.3 |
| Jakarta Activation | 1.x / 2.0 | 2.1+ |
| Jakarta Mail | 1.x / 2.0 | 2.1+ |
| Java | 8/11 | 21 |
| JAXB | 3 | 4 |
| Jetty | 11.0.x | 12.0.x |
| JLine | 3.22.0 | 4.0.14 |
| Log4j | 2.19.0 | 2.25.4 |
| Lucene | 4.x | 10.4.0 |
| SLF4J | 2.0.6 | 2.0.18 |
| Tika | 2.7.0 | 3.3.1 |
| XML:DB API | 1.x | 2.0.0 |
Full changelog: compare eXist-6.4.1 to develop
Backwards Compatibility
eXist-db 7.0.0-beta is not backwards binary compatible with previous 6.x.x releases due to:
- Java 21 requirement
- Jetty 12 / Jakarta EE 10 (javax.servlet → jakarta.servlet)
- XML:DB API 2.0 API changes
- JAXB 4 namespace changes
- On-disk format change for XML declaration preservation
A full backup and restore is required when migrating from any 6.x.x release. Applications should be reviewed for the breaking changes detailed above, particularly around serialization behavior, function signatures, and namespace management.
For users migrating from 4.x.x or 5.x.x versions, please first upgrade to the latest 6.x.x release before migrating to 7.0.0-beta.