ClassNotFoundException in custom groovy task

I’m pretty new to gradle/groovy so please bare with me.

I’ve written a custom task which extends org.gradle.api.DefaultTask for gradle 6.0.1.
One of the things I’m trying to do in this task is update an hsqldb database as follows:

    def updateDatabase() {
        getLogger().warn("updateDatabase()")
        def driverName = 'org.hsqldb.jdbc.JDBCDriver'
        Class.forName(driverName)

        Sql sql = Sql.newInstance("jdbc:hsqldb:${dbDestinationDir}/sampledb", 'sa', '', driverName)
        sql.execute 'update app_config set URL_DISCOVERY = false'
        sql.execute 'commit'
        sql.execute 'shutdown script'
}

and

task setupDatabase(type: SetupDatabaseTask) {
    description = "Deletes and re-initializes the database"
}

I’m getting a ClassNotFoundException for org.hsqldb.jdbc.JDBCDriver when I try to run the task in

./gradlew setupDatabase

In my build.gradle file I have the following defined.

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath group: 'org.hsqldb', name: 'hsqldb', version: '2.3.2'
    }
}

Here are the things I’ve tried.

  1. Verified that org.hsqldb.jdbc.JDBCDriver.class is in the hsqldb jar file
  2. turned off the gradle daemon just to make sure the runtime environment for gradle is fresh
  3. called Class.forName(driverName, false, getClass().getClassLoader()) as another option
  4. run with --full-stacktrace on. Below you should find a section of the result which appears to show the hsqldb jar file is being found.
  5. If I put the following directly in my build.gradle file, the class file loads correctly for ./gradlew exampleTask.
task exampleTask {
    def driverName = 'org.hsqldb.jdbc.JDBCDriver'
    Class.forName(driverName)
    def dataSource = new org.hsqldb.jdbc.JDBCDataSource(database: 'jdbc:hsqldb:mem:temp', user: 'sa', password: '')
    def sql = new groovy.sql.Sql(dataSource)
//    def sql = groovy.sql.Sql.newInstance("jdbc:hsqldb:web/WEB-INF/db/bcast", 'sa', '', driverName)
    println sql.rows('SELECT CURRENT_DATE AS today, CURRENT_TIME AS now FROM (VALUES(0))')
    sql.close()
}

So the class path must not be configured correctly when I’m trying to run the custom task out of the buildSrc/main/groovy/SetupDatabaseTask.groovy file.

As is always the case for me, this is the last thing not working before this subproject is complete, so I’m stuck. Any ideas would be greatly appreciated.

11:30:22.368 [DEBUG] [org.gradle.cache.internal.btree.BTreePersistentIndexedCache] Opening cache module-metadata.bin (/home/john/.gradle/caches/modules-2/metadata-2.71/module-metadata.bin)
11:30:22.386 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver] Attempting to resolve component for org.hsqldb:hsqldb:2.3.2 using repositories [MavenRepo, Gradle Central Plugin Repository]
11:30:22.389 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository] Using cached module metadata for module 'org.hsqldb:hsqldb:2.3.2' in 'MavenRepo'
11:30:22.392 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver] Using org.hsqldb:hsqldb:2.3.2 from Maven repository 'MavenRepo'
11:30:22.400 [DEBUG] [org.gradle.internal.component.model.ComponentAttributeMatcher] Selected matches [org.hsqldb:hsqldb:2.3.2 configuration runtime] from candidates [org.hsqldb:hsqldb:2.3.2 configuration compile, org.hsqldb:hsqldb:2.3.2 configuration runtime, org.hsqldb:hsqldb:2.3.2 configuration platform-compile, org.hsqldb:hsqldb:2.3.2 configuration platform-runtime, org.hsqldb:hsqldb:2.3.2 configuration enforced-platform-compile, org.hsqldb:hsqldb:2.3.2 configuration enforced-platform-runtime] for {org.gradle.dependency.bundling=external, org.gradle.jvm.version=8, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}
11:30:22.401 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder] Visiting configuration org.hsqldb:hsqldb:2.3.2(runtime).
11:30:22.412 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.resolveengine.oldresult.TransientConfigurationResultsBuilder] Flushing resolved configuration data in Binary store in /tmp/gradle2130934523850605787.bin. Wrote root 2.
11:30:22.412 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Completing Build operation 'Resolve dependencies of :classpath'
11:30:22.412 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Resolve dependencies of :classpath' completed
11:30:22.412 [DEBUG] [org.gradle.internal.component.model.ComponentAttributeMatcher] Selected match org.hsqldb:hsqldb:2.3.2 configuration runtime from candidates [org.hsqldb:hsqldb:2.3.2 configuration runtime] for {org.gradle.dependency.bundling=external, org.gradle.jvm.version=8, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}
11:30:22.412 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Resolve files of :classpath' started
11:30:22.413 [DEBUG] [org.gradle.internal.work.DefaultWorkerLeaseService] Worker lease root.1.16.17 started (1 worker(s) in use).
11:30:22.414 [DEBUG] [org.gradle.internal.resources.AbstractTrackedResourceLock] Daemon worker: acquired lock on root.1.16.17
11:30:22.414 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Resolve hsqldb.jar (org.hsqldb:hsqldb:2.3.2)' started
11:30:22.417 [DEBUG] [org.gradle.cache.internal.DefaultCacheAccess] Creating new cache for metadata-2.71/module-artifact, path /home/john/.gradle/caches/modules-2/metadata-2.71/module-artifact.bin, access org.gradle.cache.internal.DefaultCacheAccess@20d9920e
11:30:22.417 [DEBUG] [org.gradle.cache.internal.btree.BTreePersistentIndexedCache] Opening cache module-artifact.bin (/home/john/.gradle/caches/modules-2/metadata-2.71/module-artifact.bin)
11:30:22.420 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository] Found artifact 'hsqldb.jar (org.hsqldb:hsqldb:2.3.2)' in resolver cache: /home/john/.gradle/caches/modules-2/files-2.1/org.hsqldb/hsqldb/2.3.2/970fd7b8f635e2c19305160459649569655b843c/hsqldb-2.3.2.jar
11:30:22.421 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Completing Build operation 'Resolve hsqldb.jar (org.hsqldb:hsqldb:2.3.2)'
11:30:22.421 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Resolve hsqldb.jar (org.hsqldb:hsqldb:2.3.2)' completed
11:30:22.421 [DEBUG] [org.gradle.internal.work.DefaultWorkerLeaseService] Worker lease root.1.16.17 completed (1 worker(s) in use)
11:30:22.421 [DEBUG] [org.gradle.internal.resources.AbstractTrackedResourceLock] Daemon worker: released lock on root.1.16.17
11:30:22.422 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Completing Build operation 'Resolve files of :classpath'
11:30:22.422 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Resolve files of :classpath' completed
11:30:22.423 [DEBUG] [org.gradle.internal.component.model.ComponentAttributeMatcher] Selected match org.hsqldb:hsqldb:2.3.2 configuration runtime from candidates [org.hsqldb:hsqldb:2.3.2 configuration runtime] for {org.gradle.dependency.bundling=external, org.gradle.jvm.version=8, org.gradle.libraryelements=jar, org.gradle.usage=java-runtime}

I think I figured it out. The problem was that my buildSrc/build.gradle file needed the following added to it.

dependencies {
    compile(gradleApi())
    compile group: 'org.hsqldb', name: 'hsqldb', version: '2.3.2' // THIS WAS THE MISSING LINE
    testCompile 'junit:junit:4.11'
}

In my original post I only had hsqldb referenced in the build.gradle file in the project root directory.