Extension Installation
Extension Installation
Extensions add capabilities to Lucee — JDBC drivers, resource providers (S3, Redis), image handling, PDF generation, and more. You can find available extensions at download.lucee.org.
Standard vs Light vs Zero
The standard Lucee jar bundles common extensions (PDF, image, etc.) so they are available out of the box.
Lucee Light and Lucee Zero include no bundled extensions — you must explicitly declare every extension you need. This makes them ideal for containerised deployments where you want full control over what's installed.
Lucee Light includes the Lucee Admin archive (.lar), while Zero doesn't, saving about 2Mb.
In order to enable the Admin with Lucee light, you need to install the Admin Extension, which just adds a mapping to the the archive.
You can disable installing the bundled extensions on deploy by setting this ENV var to false:
LUCEE_EXTENSIONS_INSTALL
SysProp: -Dlucee.extensions.install
EnvVar: LUCEE_EXTENSIONS_INSTALL
A boolean value to enable/disable the installation of extensions
Type: boolean | Default: true
Version Resolution
Version is optional in all installation methods. When omitted, Lucee resolves the latest release version from Maven. SNAPSHOTs are only used as a fallback if no release exists. The resolved version is written back to the server's config file on disk.
Note (since 7.0.3.10): Prior to this fix, a SNAPSHOT would be installed if one existed with a higher version number than the latest release.
Pinning versions is strongly recommended. An unpinned extension may install a different version after an upgrade or redeploy
Pinned versions also deploy faster as version resolution requires a remote lookup — pinning avoids that overhead at deploy time.
Bootstrapping pinned versions
A useful workflow for setting up a new environment:
- Deploy with extension IDs only (no version)
- Lucee resolves and installs the latest release, writing the resolved version back to the config file
- Extract the
extensionsblock from the server's.CFConfig.jsonand use those pinned versions in your build config
Installation Methods
Lucee Administrator
Navigate to Extensions > Applications in the Lucee Server Administrator to install or uninstall extensions interactively.
Best for: one-off installs and exploration. Not suitable for automated deployments.
deploy Directory
Copy an extension file (.lex) into {lucee-installation}/lucee-server/deploy. Lucee picks it up at startup or within a minute and installs it.
In a Docker image, you can download extensions at build time so they are baked into the image:
RUN mkdir -p /opt/lucee/server/lucee-server/deploy && \
wget -nv https://ext.lucee.org/s3-extension-2.0.2.21.lex \
-O /opt/lucee/server/lucee-server/deploy/s3-extension-2.0.2.21.lex && \
wget -nv https://ext.lucee.org/image-extension-2.0.0.29.lex \
-O /opt/lucee/server/lucee-server/deploy/image-extension-2.0.0.29.lex
Best for: hot deployment on a running server, scripted installs where you already have the file locally. Some extensions require a restart to take effect.
.CFConfig.json
Define extensions in your .CFConfig.json configuration file:
{
"extensions": [
{
"id": "07082C66-510A-4F0B-B5E63814E2FDF7BE",
"version": "1.0.0.11"
},
{
"id": "60772C12-F179-D555-8E2CD2B4F7428718",
"path": "/opt/lucee/extensions/redis.extension-3.0.0.51.lex"
},
{
"id": "17AB52DE-B300-A94B-E058BD978511E39E"
}
]
}
name is always optional. You can provide a path to a local file or any Lucee virtual filesystem path (HTTPS, S3, FTP, etc.) instead of resolving from Maven.
Important: CFConfig extensions are only processed on a fresh install. They are not re-evaluated on subsequent startups. On a fresh install, Lucee also installs the bundled extensions. Extensions already installed but absent from the list are left in place — CFConfig only adds, it does not remove.
For Multi-Mode (Server and Web Admin enabled, Lucee 6), add extensions to the server context config at {lucee-installation}/lucee-server/context/.CFConfig.json, not the web context.
Best for: declarative, config-as-code setups.
Environment Variable / System Property
Set LUCEE_EXTENSIONS (env var) or -Dlucee.extensions (system property) to a comma-separated list of extensions. Lucee re-processes it when the value changes (checked every 10 seconds).
LUCEE_EXTENSIONS=99A4EF8D-F2FD-40C8-8FB8C2E67A4EEEB6;version=12.2.0.jre8,671B01B8-B3B3-42B9-AC055A356BED5281;version=42.7.3
Or with Gradle-style coordinates (7.0.1+):
LUCEE_EXTENSIONS=org.lucee:s3-extension:2.0.2.21,org.lucee:redis-extension:3.0.0.56
LUCEE_EXTENSIONS_INSTALL
SysProp: -Dlucee.extensions.install
EnvVar: LUCEE_EXTENSIONS_INSTALL
A boolean value to enable/disable the installation of extensions
Type: boolean | Default: true
Best for: Docker/container deployments, CI/CD pipelines, infrastructure-as-code.
Format Reference
All installation methods that accept extension identifiers support the same formats.
UUID only (version resolved automatically)
99A4EF8D-F2FD-40C8-8FB8C2E67A4EEEB6,
671B01B8-B3B3-42B9-AC055A356BED5281
UUID with attributes
99A4EF8D-F2FD-40C8-8FB8C2E67A4EEEB6;name=MSSQL;label=MS SQL Server;version=12.2.0.jre8,
671B01B8-B3B3-42B9-AC055A356BED5281;name=PostgreSQL;version=42.7.3
Gradle-style coordinates (Lucee 7.0.1+)
org.lucee:lucene-search-extension:3.0.0.163,
org.lucee:redis-extension:3.0.0.56
Version can be omitted — org.lucee:s3-extension resolves the latest release:
org.lucee:s3-extension,
org.lucee:redis-extension
Custom path
Use ;path= to load from a specific location instead of Maven. Combine with a UUID or Gradle coordinates:
60772C12-F179-D555-8E2CD2B4F7428718;path=/opt/lucee/extensions/redis.extension-3.0.0.51.lex,
17AB52DE-B300-A94B-E058BD978511E39E;path=https://ext.lucee.org/s3-extension-2.0.1.25.lex,
org.lucee:redis-extension:3.0.0.56;path=s3:///mybucket/extensions/redis.lex
All Lucee virtual file systems are supported (local, HTTP/HTTPS, S3, FTP, ZIP/TAR, Git, RAM, etc.).
Mixed formats
You can combine formats freely:
99A4EF8D-F2FD-40C8-8FB8C2E67A4EEEB6;version=12.2.0.jre8,
org.lucee:lucene-search-extension:3.0.0.163,
671B01B8-B3B3-42B9-AC055A356BED5281;path=s3:///mybucket/extensions/postgresql.lex
LUCEE_BASE_CONFIG Interaction
When LUCEE_BASE_CONFIG is set, Lucee uses that file as the server config instead of the default .CFConfig.json in the server context directory. Any config updates — including resolved extension versions written back after install — go to that file.
If your base config is shared, version-controlled, or read-only, this can be a problem. To install extensions without modifying your base config, drop a .CFConfig.json snippet into the deploy/ directory. Lucee imports it, applies the changes to the running server's own config, then deletes the file — leaving your base config untouched.
Logging and Troubleshooting
Check {lucee-installation}/lucee-server/context/logs/deploy.log for details on what was installed and any errors. It defaults to info level and logs all deploy actions including resolved versions.