eXist v7.0.0-beta3 Release Notes

Release Date: 2026-06-02 // 9 days ago
  • 🚀 Release Notes — eXist-db 7.0.0-beta3

    NOTE Mac DMG and win exe installers 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.

    0️⃣ 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.

    0️⃣ 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 class
    • 📜 org.apache.lucene.queryParser.* (capital P) — package renamed to lowercase; update to org.apache.lucene.queryparser.*
    • org.apache.lucene.analysis.util.* — moved to org.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 argument
    • org.exist.indexing.lucene.analyzers.NoDiacriticsStandardAnalyzer — removed; use org.apache.lucene.analysis.standard.StandardAnalyzer instead

    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 count clause 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 sequence
    • 📜 fn:unparsed-text — improved conformance, BOM stripping, and security-gated file:// URI resolution
    • fn: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/charset meta suppression in HTML/XHTML head
    • cdata-section-elements prefix resolution via static namespaces
    • xmlns="" 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 / KnnFloatVectorQuery support enabling semantic search via:

      • ft:query-vector($nodes, $vector, $k?) — KNN vector search with optional top-k parameter
      • ft: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:* namespace http://exist-db.org/xquery/vector):

      • vector:embed($text, $model, $model-path?, $api-key?) — single-text embedding
      • vector:embed-batch($texts, $model, $model-path?, $api-key?) — batch embedding
      • vector:models() — list known embedding models
      • vector:diagnostics() — provider status and model cache info
    • Embedding providers — ONNX Runtime (local CPU/GPU models) and HTTP providers (OpenAI, Cohere-style APIs)

    • *...


Previous changes from v6.4.1