This Lucee 7.0.2 release is a maintenance release, focussing on
- classloader / memory stability
- datasource connection pool fixes
- component inheritance fixes
- performance
- robustness
Docker and Installers Bundle
- Java 21.0.10+7-LTS
- Tomcat 11.0.18
Support Lucee
Lucee is open source and free to use! If Lucee is valuable to your organisation, please consider supporting the project β contributions of code, documentation, and sponsorship all help keep Lucee moving forward.
Changelog
Classloader & Memory Management
The biggest area of work in this release β resolving long-standing classloader stability issues that caused ClassNotFoundException errors and memory pressure under load.
- LDEV-5903 β Major classloader rework: fix PageSourcePool not being flushed, apply
inspectTemplateon all application mappings, replace PhysicalClassLoader when threshold reached, use SoftReference for loaders, use identity hash code for classloader mapping - LDEV-6107 β Fix stale className references after classloader flush causing
ClassNotFoundException, refactor dynamic invocation to support reflection vs runtime class creation, addlucee.dynamic.invocationenv var to control behaviour - LDEV-1109 β Pin RAM resource directories with HardRef to prevent garbage collection from making RAM drives disappear
- LDEV-6090 β Flush existing classloader from factory on revert
Datasource & Connection Pool
Complete overhaul of connection pool defaults and behaviour to eliminate connection leaks, deadlocks, and thread starvation.
- LDEV-5962 β Fix pool config: correct
maxTotaldefault from 0, setmaxWaitMillisto 30 seconds - LDEV-5963 β Wire
idleTimeouttominEvictableIdleTimeMillisso idle connections are actually evicted - LDEV-5964 β Reuse connection in
store()to prevent nested borrow deadlock - LDEV-5965 β Return false when datasource connection validation throws exception instead of propagating
- LDEV-5966 β Return connection to pool on timeout instead of closing directly
- LDEV-5991 β Change default datasource idle timeout to 10 minutes
- LDEV-6051 β Default
maxIdletoconnectionLimitfor better connection reuse - LDEV-6066 β Streamline
verifyDatasource - LDEV-6108 β Unhide
GetSystemMetrics()as an official BIF for monitoring datasource connection pools - LDEV-5972 β Refactor modern MSSQL approach
Session Management
- LDEV-5930 β Fix session component property loss in storage scopes
- LDEV-5942 β
sessionRotate()now rotates JSESSIONID for J2EE sessions, gracefully handle fake JEE sessions under JSR-223 - LDEV-6046 β
sessionInvalidate()properly de-activates old session when using database storage
Component & Inheritance
- LDEV-6056 β Fix
super.method()resolution in deep component hierarchies with same-named components across different mappings - LDEV-6055 β Fix misleading βprivateβ in
super.method()error message - LDEV-5913 β Fix closure regression: properly resolve current component
- LDEV-5894 β Fix closure-in-closure resolution
- LDEV-6004 β Fix regression:
Property.getDefault()should return null for unset defaults - LDEV-5821 β Fix property metadata regressions, optimise
cfpropertyattribute handling
OSGi & Extensions
- LDEV-6075 β Fix
StackOverflowErrorin OSGi bundle loading caused by circular dependencies - LDEV-5917 β Boot delegate
java.*packages in OSGi config - LDEV-5885 β Lock down extension manipulation to single thread
- LDEV-5955 / LDEV-5957 β Fix extension startup hook handling and lifecycle
- LDEV-6012 β Add fallback OSGi mapping for
sun.jna - LDEV-5905 β Lock down file access to installed extension files and cache them
- LDEV-6088 β Add test to check and report extension bundle problems
- LDEV-6161 β ESAPI Extension v2 β v3: OWASP Encoder Migration
Configuration & Deployment
- LDEV-6091 β Add
modeattribute tojavasettingsinApplication.cfc("replace","extend","inherit") to control whether Application.cfc JavaSettings replace or merge with CFConfig settings (default is still merge/extend) - LDEV-6105 β Add configurable Maven download policy (
ignore/warn/error) with separate startup and runtime settings - LDEV-5863 β Add forced sync to config file writes to prevent Docker read race condition
- LDEV-5976 β Fix error merging
cfconfig.json - LDEV-5931 β Fix local file access security in single mode
- LDEV-5849 β Add
LUCEE_TAG_POPULATE_LOCALSCOPEenvironment variable - LDEV-5860 β Add Gradle-style support with extension definition in environment variables
- LDEV-6116 β Extended SecretProvider API: add
SecretProviderSet(),SecretProviderRemove(),SecretProviderList(),SecretProviderListNames()BIFs, plusFileSecretProviderwith JSON and env file format support - LDEV-5851 β Call extension providers async, disable Maven extension provider by default
- LDEV-5850 β Improve SysProp / Env Var documentation
Admin
- LDEV-6085 β Fix
scopeCascadingTypeandtemplateCharsetnot saving - LDEV-5853 β Admin search page: show message when extension isnβt installed
- LDEV-5854 β Admin ORM page: link to extension when no engine is installed
- LDEV-5947 β Admin overview shouldnβt show alphas for stable releases, improve CSS
- LDEV-5915 β Fix web context label name in admin
- LDEV-6065 β Force null support=false for the admin
- LDEV-6068 / LDEV-6069 β Refactor admin update version handling, fix extension version comparison
- LDEV-5856 β Update monitor installation to use new JSON config structure
- LDEV-5899 β Fix admin
updateMappingswithtype=serverupdating wrong config - LDEV-5900 β Add
errorVariablefor admincompileMappingandcreateArchive
CFML Language & Functions
- LDEV-6058 β Enable
val()as a member function - LDEV-5954 β
query.addParamnow supports arrays whenlist=true - LDEV-5339 β Add
IsThreadInterrupted()andThreadInterrupted()functions - LDEV-6010 β Add
cachedwithinId()andcachedwithinFlush()BIFs for selective cache invalidation of queries, functions, and HTTP results - LDEV-5634 β QoQ now throws on invalid columns
- LDEV-6063 β
cfflushno longer setsConnection: closeheader - LDEV-5997 β AI response listener streaming support (Gemini), including binary parts and multi-part content types
- LDEV-296 β Throw error when unsupported
initMethodis used - LDEV-5845 β Update SQL parser to support
FROMjoin syntax for HSQLDB fallback
AST & Compiler
- LDEV-5836 β Add
isBuiltIntocreateExpressionand CFML tag AST nodes for identifying custom tags - LDEV-5839 β Add
modeargument toastFromStringwith offset script wrapping - LDEV-5855 β Add named argument support for
astFromString - LDEV-5898 β Fix NPE with AST for
forloops - LDEV-6023 β Improve parser
TemplateExceptionwith better context - LDEV-5927 β Validate
javasettingsis valid JSON at compile time - LDEV-5763 β Throw compiler error when
javasettingsisnβt a JSON string
HTTP
- LDEV-5904 β Fix HTTP timeout handling
- LDEV-5932 β Fix
cfhttpcompression support with GET requests - LDEV-5869 β Cookie parsing now correctly handles values containing
= - Cap HTTP connection timeout at 20 seconds to prevent DNS/handshake hangs
Performance
- LDEV-6097 β Cache
NativeExceptionand createCatchBlockonly once perPageException(see Known Issues β LDEV-6135) - LDEV-5907 β Use non-sync
HashMapfor named args and sized structs - LDEV-5950 β Use
ConcurrentHashMap.newKeySet()for treeNode - LDEV-5951 β Pre-size internal query structs and arrays
- LDEV-5910 β Faster
cfdirectoryattribute reading on Windows - LDEV-5844 β Resource execution log buffering, avoid out of memory with large execution logs
- LDEV-5935 β Reduce XML logging overhead
Bug Fixes
- LDEV-5889 β
lucee.preserve.caselogic was reversed - LDEV-6043 β Fix
DecimalFormatbug - LDEV-5730 β Fix JSession casting bug
- LDEV-5876 β Wrap jakarta/javax exception if needed
- LDEV-6120 β Look for Jakarta-specific tag class first
- LDEV-6073 β Add
formtag-formtolucee-context.lar - LDEV-5909 β Fix CommandBox tray icon by removing
java.awt.headless=truesetting - LDEV-5437 β Fix relative path resolution outside mappings
- LDEV-6057 β Handle null values in datasource connection string replacement
- LDEV-5873 β Fix
udfs.clear()inpageContext.release()needing additional check - LDEV-5884 β Fix version comparison copy-paste bug
- LDEV-6048 β Fix loader
LUCEE_VERSIONwarning check - LDEV-5605 β Fix exception line numbers for inline and sub components
- LDEV-5659 β Fix OSGi version qualifier range comparison using wrong variable
- LDEV-5891 β Fix NPE in admin datasource verification when connection returns null
- LDEV-5939 β Validate directory is specified for delete/rename operations
- LDEV-5943 β Fix inspect auto defaults
- LDEV-6098 β Revert the removal of
apache.commons.lang - LDEV-2390 β Fix
timesloop withbreakandcontinue
Error Messages & Logging
- LDEV-3892 β Add context to βcanβt cast complex object structβ exceptions with scopes
- LDEV-5906 β Improve missing argument name exception
- LDEV-5875 β Add extra logging for component loading errors
- LDEV-6129 β Additional logging for ORM session exceptions
- LDEV-5921 β Improve logging checks
- LDEV-5830 β Log extension downloads, reduce read timeout to 20 seconds
- LDEV-5901 β Add tag attribute groups for more organized documentation
Other
- LDEV-6021 β Check application context for default caches
- LDEV-6020 β Order argument keys for cache key creation
- LDEV-5859 β Change
.exlfile naming torequestId-pcId-serverStartTime, add parent thread info to child execution logs - LDEV-5870 β Allow unknown tags in AST
- LDEV-5122 β Refactor core internal downloaders to use common class with Maven repo support
Extensions Bundled
With 7.0.2, we now support Maven GAV Syntax for Extensions
Key extensions:
- MySQL JDBC 9.5.0
- MSSQL JDBC 13.2.1
- PostgreSQL JDBC 42.7.7
- JTDS JDBC 1.3.1
- Administrator 1.0.0.6
- S3 2.0.3.0
- PDF 2.0.1.0
- Image 3.0.0.6
- ESAPI 3.0.0.14
Upgrading
This is a significant release with connection pool default changes β if you have existing datasource configurations, review your connection pool settings after upgrading. The new defaults (maxIdle = connectionLimit, idle timeout = 10 minutes) are more sensible for most workloads but may differ from your tuned values.
JavaSettings: A new mode attribute is available in Application.cfc javasettings ("replace", "extend", "inherit") to control how Application.cfc JavaSettings interact with CFConfig settings. The default behaviour (merge/extend) is unchanged.
If youβre running on Docker, the config file sync improvements (LDEV-5863) should resolve race conditions on container startup.
Known Issues
The following regressions have been identified and are already fixed on the 7.0.3 branch. A 7.0.3 RC is expected shortly.
- LDEV-6135 β Thread corruption in the NativeException LRU cache introduced by the LDEV-6097 caching optimisation β can cause unexpected exceptions under concurrent load
- LDEV-6138 β Connection leak in
releaseConnection()for unmanaged connections - LDEV-6139 β ORM
releaseORM()doesnβt callcloseAll()whenflushAll()throws, leaking ORM sessions - LDEV-6132 β JavaSettings ClassLoader not reused when file contents havenβt changed (now uses file checksums as cache key)
- LDEV-6133 β Idle ClassLoaders not being cleaned up
- LDEV-6147 β ExtensionProvider preferring SNAPSHOTs over releases
