无法从Gradle构建脚本中查询数据库

Eve*_*ali 3 sql-server groovy jtds gradle

我正在尝试从gradle脚本任务中查询数据库。我从一个普通的脚本开始验证代码

import groovy.sql.Sql

this.class.classLoader.rootLoader.addURL(new URL('file:<..>/jtds-1.2.2.jar'))
def driver = 'net.sourceforge.jtds.jdbc.Driver'
def dburl = "jdbc:jtds:sqlserver://ITSVIL:1433/APPDB"
def first
Sql.withInstance(dburl, '<..>', '<..>', driver) {
    sql ->
        first = sql.firstRow( "SELECT * FROM PROJECT" )
}
Run Code Online (Sandbox Code Playgroud)

我使用groovy QueryTest.groovy启动并验证了它是否有效。然后我在gradle任务中移动了脚本,代码没有任何变化,但由gradle buildscript语句处理了加载

import groovy.sql.Sql

defaultTasks 'queryTest'

buildscript {
    dependencies {
        classpath files('<..>/jtds-1.2.2.jar')
    }
}

task queryTest () {

    // l'update va su REPOSITORYURL + '/' + alm.project.vcrProjectName + '/' + Reference

    doLast {

        def driver = 'net.sourceforge.jtds.jdbc.Driver'
        def dburl = "jdbc:jtds:sqlserver://ITSVIL:1433/APPDB"
        def first
        Sql.withInstance(dburl, '<..>', '<..>', driver) {
            sql ->
                first = sql.firstRow( "SELECT * FROM PROJECT" )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用gradle -b QueryTest.gradle启动,这次我得到了

Execution failed for task ':queryTest'.
> java.sql.SQLException: No suitable driver found for jdbc:jtds:sqlserver://ITSVIL:1433/IKALM_APP
Run Code Online (Sandbox Code Playgroud)

尝试了我在论坛上发现的任何可能的建议,但均未成功。会寻求帮助。

Eve*_*ali 5

由于groovy动态特性,gradle中的类加载非常复杂。我想给我指出来一个很好的解释感谢@cptwonton 这里

我不得不稍微修改gradle脚本,这是工作版本。jdts-1.2.2.jar位于flatDir引用的lib目录中。

import groovy.sql.Sql

defaultTasks 'queryTest'

task queryTest () {
    repositories {
        flatDir {
            dirs 'lib'
        }
    }
    configurations {
        jdbc
    }
    dependencies {
        jdbc 'net.sourceforge.jtds:jtds:1.2.2'
    }

    doLast {
        def sqlClassLoader = Sql.classLoader
        configurations.jdbc.each { sqlClassLoader.addURL it.toURI().toURL() }

        def driver = 'net.sourceforge.jtds.jdbc.Driver'
        def dburl = "jdbc:jtds:sqlserver://ITSVIL:1433/APPDB"
        def first
        Sql.withInstance(dburl, '<..>', '<..>', driver) {
            sql ->
                first = sql.firstRow( "SELECT * FROM PROJECT" )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)