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

时间:2018-01-23 15:15:16

标签: sql-server gradle groovy jtds

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

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" )
}

我使用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" )
        }
    }
}

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

Execution failed for task ':queryTest'.
> java.sql.SQLException: No suitable driver found for jdbc:jtds:sqlserver://ITSVIL:1433/IKALM_APP

尝试在论坛中找到的任何可能的建议都没有成功。会请求帮助。

2 个答案:

答案 0 :(得分:4)

由于groovy动态特性,gradle中的类加载非常复杂。我要感谢@cptwonton给我一个很好的解释here

我不得不稍微修改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" )
        }
    }
}

答案 1 :(得分:0)

您的net.sourceforge.jtds.jdbc.Driver似乎无法使用。 这可能是因为

中的路径存在问题
buildscript {
    dependencies {
        classpath files('..../jtds-1.2.2.jar')
    }
}

您提供给类路径文件的路径路径)需要是gradle项目目录根目录的相对路径。我建议将你的jtds jar移到libs目录中,看看这个doc: https://docs.gradle.org/current/userguide/dependency_management.html#sub:file_dependencies

此外,jtds jar在maven repo上,为什么不使用它而不是本地jar? gradle和maven等构建工具的优点在于,您无需在本地存储或管理许多流行的jar。