Loader.groovy

class Loader {

    def sideLoadDrivers (def driversDir) {
        def drivers = new File(driversDir).listFiles(
            [accept: { it.name.endsWith('.jar') }] as FileFilter
        ).collect { def jar ->
        println "Processing jar: ${jar}"
            def jarFile = new java.util.jar.JarFile(jar)
            def svcFile = jarFile.getEntry('META-INF/services/java.sql.Driver')
            // pick the first non empty line
            def driverClassName = svcFile ? jarFile.getInputStream(svcFile).readLines().find { it.trim() }?.trim() : null

            [driver: driverClassName, url: jar.toURI().toURL()]
        }

        def driversClassLoader = new URLClassLoader(
            drivers*.url as URL[],
            this.class.classLoader
        )
        Thread.currentThread().setContextClassLoader(driversClassLoader)

        drivers.findAll { it.driver }*.driver.each {
            def driverClass = driversClassLoader.loadClass(it)
            println "Registering driver: ${ it }"
            def driverShim = new Wrapper(wrapped: driverClass.newInstance())

            java.sql.DriverManager.registerDriver(driverShim)
        }
    }

    /**
     * Parse first input line as if thewy were args from main
     */
    def getArgs(InputStream input) {
        def line = input.newReader().readLines().first
        return (line =~ /"[^"]*"|'[^']*'|[^\s]+/).collect { 
            it.replaceAll(/^["']|["']$/,'')
        }.toArray()
    }
}