Context & Summary
With Lucee 7 retiring the legacy internal scheduler in favor of the Quartz Scheduler Extension (id: E99E43A5-C10E-41E9-878BFC82BAAD99CE), Quartz is now a core component of the runtime.
Starting in Lucee 7.1, any server or container boot running the Quartz extension emits the following warning to stderr during startup:
log4j:WARN No appenders could be found for logger (org.quartz.impl.StdSchedulerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
SLF4J(W): No SLF4J providers were found.
SLF4J(W): Defaulting to no-operation (NOP) logger implementation
SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.
We checked the upstream repository across all branches (including master at 1.1.0.14-SNAPSHOT and 1.0 at 1.0.0.69-SNAPSHOT). The root cause is the dependency declarations in JavaSettings.cfc, Quartz.cfc, and maven-dependencies.xml.
Root Cause of the Warning
Quartz.cfc and JavaSettings.cfc declare the following Maven dependencies:
{
"groupId": "log4j", "artifactId": "log4j", "version": "1.2.17"
},
{
"groupId": "org.slf4j", "artifactId": "slf4j-log4j12", "version": "1.7.7"
}
- Quartz does not use Log4j: Quartz 2.3.2 is built natively against
slf4j-api. - Missing Appender: Bundling
slf4j-log4j12routes SLF4J calls directly into Log4j 1.x. Because nolog4j.propertiesis provided on the classpath whenStdSchedulerFactoryinitializes, Log4j 1.x warns about missing appenders. - Security / End of Life:
log4j:1.2.17reached End-of-Life in 2015 and carries known high-severity vulnerabilities (CVE-2019-17571, CVE-2022-23302, etc.). Lucee core modernized to Log4j 2 long ago; bundling legacy Log4j 1.x in the core scheduler extension is unnecessary risk.
Additional Dependency Audit
Looking at the remaining entries in javaSettings.maven, several other libraries appear to be copy-pasted artifacts from Quartz’s standalone distribution that Lucee never actually uses:
-
com.zaxxer:HikariCP-java7:2.4.13(Obsolete):- This is an ancient Java 7 backport from 2015. Lucee 7 runs on Java 11/17/21+.
- When configured with a Lucee datasource (
store.type = "datasource"), Quartz uses Lucee’s ownConnectionProviderImpl.cfc, which borrows connections directly from Lucee’s datasource manager (pc.getDataSourceManager()). HikariCP-java7 is never invoked.
-
com.mchange:c3p0:0.9.5.4(Redundant for Lucee stores):- Like HikariCP, c3p0 is only used by standalone Quartz setups managing their own JDBC pools. When Lucee datasources are used,
ConnectionProviderImplhandles pooling.
- Like HikariCP, c3p0 is only used by standalone Quartz setups managing their own JDBC pools. When Lucee datasources are used,
-
org.quartz-scheduler:quartz-jobs:2.3.2(Unused):quartz-jobsonly contains built-in utility jobs (DirectoryScanJob,FileScanJob,SendMailJob,NativeJob).- Lucee executes tasks through its own custom CFML wrappers (
ComponentJob.cfcandURLJob.cfc), soquartz-jobsis unused overhead.
-
org.slf4j:slf4j-api:1.7.7(Redundant & pins ancient version):org.quartz-scheduler:quartz:2.3.2already pullsslf4j-apitransitively.- Explicitly pinning
1.7.7(from 2014) injavaSettings.mavenrisks classloader collisions if application code or other Lucee 7 extensions load modern SLF4J 2.x libraries.
Verification
We verified running org.quartz-scheduler:quartz:2.3.2 with only slf4j-api on modern JVMs (Java 17/21/25). Quartz initializes, starts the thread pool, schedules/fires tasks, and shuts down cleanly with zero Log4j warnings.
Proposed Recommendations
- Remove Log4j 1.x:
Droplog4j:log4j:1.2.17andorg.slf4j:slf4j-log4j12:1.7.7. Route Quartz’s SLF4J calls through Lucee core’s logging infrastructure (e.g.log4j-to-slf4jor Log4j 2 provider). - Prune Unused Libraries:
Removecom.zaxxer:HikariCP-java7,com.mchange:c3p0, andorg.quartz-scheduler:quartz-jobs. - Let Quartz resolve its own SLF4J:
Drop the hardcodedorg.slf4j:slf4j-api:1.7.7entry so it resolves transitively fromquartz:2.3.2without pinning an ancient 2014 version.
Cleaning this up will eliminate the startup warning, trim ~6 MB of unused jars from every container/server download, and align the extension with Lucee 7’s modern Java baseline.