Last reviewed August 2026 against the official Lucee documentation and release notes.
Why this matters now
Lucee 5.4 reached end of life on 31 December 2025. It no longer receives fixes of any kind, security included, so an application still on Lucee 5 is running on borrowed time. The sensible landing spot for most applications is Lucee 6.2, the current long-term support line; newer applications with few extensions may prefer to jump straight to Lucee 7. This guide covers the 5 to 6 move in detail and tells you when to consider 7 instead.
What actually changed in Lucee 6
Most CFML code runs unchanged. The changes that matter live around the edges, in configuration, defaults, and a handful of deliberate behaviour fixes:
- Configuration moved from XML to JSON. The old
lucee-server.xmlgives way to.CFConfig.json. Lucee converts your existing configuration automatically on first start, but treat the conversion as something to verify, not trust. - Single-mode admin is the new default. The separate server and web admin contexts of Lucee 5 merge into one. If your setup leaned on per-web-context settings, review how they map before cutover (multi-mode still exists in 6, but is gone in 7).
- The Java baseline moved. Lucee 6.2 dropped Java 8; Java 11 is the minimum and Java 21 (LTS) is the recommended runtime. Plan the JVM upgrade as part of the migration, not after it.
- Several defaults changed: session cookies now default to
SameSite=LaxandHttpOnly; Lucee trusts the JVM's certificate store instead of shipping its own (SSLCertificateInstall()no longer functions);cflocationstops appending session tokens by default; and in 6.2 the default application log level becameERROR, so logs go quieter. - Some behaviours were aligned with Adobe ColdFusion:
cfqueryparamno longer silently converts empty strings to null (empty values into numeric parameters now throw, as on ACF); string member functions iterate characters rather than list items;numberFormat()rounding matches ACF;queryMap()returns a new query instead of mutating in place; and===now compares type as well as value. - The ORM extension changed hands. Hibernate ORM on modern Lucee is the Ortus ORM extension, the maintained fork of the old Lucee extension. If your app uses ORM, this swap is part of your migration.
Performance is the payoff: by the project's own measurements, Lucee 6.2 is up to 50% faster than 5.4 for some operations, helped by preciseMath defaulting off again in 6.2.
Running multi-context (shared-style) Lucee? Read this first.
Early Lucee 6 builds shipped a security bug in multi-context password handling: after a restart, a web context without its own admin password could inherit the server admin password instead of the intended default web password. Lucee 5 handled this correctly; Lucee 6 didn't. We found it, reported it, and after more than a year unfixed upstream we patched it ourselves, and every Lucee instance we host now runs our own maintained build with the fix, tracking upstream 6.2.x security releases. If you run multi-context Lucee anywhere else, test this behaviour explicitly before you upgrade. The full story is on our news page.
Pre-flight checklist
An hour of inventory saves a weekend of surprises. Before touching anything:
- List your extensions. Every Lucee extension in the admin, plus anything installed manually. Check each has a 6.x-compatible release; ORM users note the Ortus extension above.
- Record your Java version and plan the move to Java 21 LTS.
- Export your configuration. The community-standard tool is CFConfig (via CommandBox), which exports datasources, mappings, scheduled tasks and settings to JSON you can diff and re-import.
- Inventory scheduled tasks, datasources and mail servers independently of the export, so you can verify nothing was lost in translation.
- Grep the codebase for the breaking-change hotspots:
cfqueryparamcalls that may receive empty strings for numeric types,SSLCertificateInstall,===comparisons, string member functions used on delimited lists, code relying onqueryMap()mutating, and anything reading session cookies thatHttpOnlywill now hide from JavaScript. - Note your framework versions. ColdBox, CFWheels and FW/1 all run on Lucee 6; older releases of each may not, so check whether a framework upgrade rides along.
The upgrade, step by step
- Stand up a test environment on Lucee 6.2 with your target Java version. CommandBox makes side-by-side engines trivial; alternatively a staging environment on your host (ours are free to spin up on request) does the same job with production-shaped infrastructure.
- Import your configuration from the CFConfig export and verify datasources, mappings, scheduled tasks and mail settings arrived intact.
- Pre-scan the codebase. Lucee's mapping compile feature will compile your entire application ahead of time and surface compile-time incompatibilities in one pass, rather than one error page at a time.
- Run your regression tests, and manually exercise the areas the engine changed: anything date-heavy, anything relying on null handling, PDF generation, session behaviour across logins, and outbound HTTPS calls (the JVM certificate store change bites here, especially self-signed internal certificates).
- Soak it. Leave staging running under realistic load for a few days; watch logs at the new default levels and confirm scheduled tasks fire.
- Cut over with a rollback plan. Keep the Lucee 5 environment intact until the new one has survived a full business cycle. A migration you can reverse is a migration you can do calmly.
Should you go straight to Lucee 7?
Lucee 7 has been the stable release since November 2025. It is a bigger jump: full Jakarta EE migration (requiring Tomcat 10.1+ and Jakarta-compatible extensions), single-mode only, scheduled tasks moved to an extension, and a fresh install rather than an in-place upgrade. Our rule of thumb: a modern, framework-based app with few extensions can go straight to 7 and enjoy the longer runway; an older application with many extensions or custom setup should land on 6.2 LTS first and take 7 as a separate, calmer step. And note that 7 removes multi-context entirely: if your setup depends on it, 7 is simply not an option yet, which is one reason multi-context stays supported on our own maintained 6.2 build.
Or let us do it with you
Upgrading engines is routine work for us. On our Lucee hosting we run the target environment, stage your application, and walk the cutover with you; migrations are free on every plan, and that includes engine-version moves for hosted customers. If you are stuck on Lucee 5 somewhere else, that is exactly the situation our free migration exists for.
Still on Lucee 5?
Every month on an end-of-life engine is unpatched exposure. Move to supported Lucee with people who do this every week.