2015-03-12 3 views
3

У меня есть следующий сценарий gradle. Это приводит к ошибке No suitable driver found, которую я нашел странно.Gradle: невозможно выполнить sql, драйвер не найден

buildscript { 
    repositories{ 
     maven { 
      url = 'http://localhost:8090/nexus/content/groups/public/' 
     } 
    } 
    dependencies { 
     classpath 'com.oracle:ojdbc6:11.2.0.4.0' 
    } 
} 

task sql << { 
    def url = 'jdbc:oracle:thin:@' + project.properties['db_hostname'] + ':' + project.properties['db_port'] + ':' + project.properties['db_sid'] 
    println 'sql, db url:' + url 
    def driverName = 'oracle.jdbc.OracleDriver' 
    Class.forName(driverName).newInstance(); 
    groovy.sql.Sql sql = groovy.sql.Sql.newInstance(
      url, 
      project.properties['db_username'], 
      project.properties['db_password'], 
      driverName 
    ) 
} 

Ошибка:

Tasks to be executed: [task ':sql'] 
:sql (Thread[main,5,main]) started. 
:sql 
Executing task ':sql' (up-to-date check took 0.0 secs) due to: 
    Task has not declared any outputs. 
truncating, db url:jdbc:oracle:thin:@LOCALHOST:1521:orcl 
:sql FAILED 
:sql (Thread[main,5,main]) completed. Took 0.105 secs. 

FAILURE: Build failed with an exception. 

* Where: 
Build file '/home/fran/projects/jua/build.gradle' line: 49 

* What went wrong: 
Execution failed for task ':sql'. 
> No suitable driver found for jdbc:oracle:thin:@LOCALHOST:1521:orcl 

* Try: 
Run with --debug option to get more log output. 

ответ

3

Сосуд драйвер загружается в другом контексте, чем загрузчика классов класса Sql. Чтобы исправить это, попробуйте добавить следующее:

// Add jars resolved by buildscript classpath configuration to the classloader which Sql will use 
URLClassLoader loader = groovy.sql.Sql.class.classLoader 
project.buildscript.configurations.classpath.each { File file -> 
    loader.addURL(file.toURL()) 
} 

до вызова Sql.newInstance(). Он сделает все ваши зависимостей classpath доступными для загрузчика классов Groovy, который загружает класс Sql. Class.forName() не обязателен.

Смотрите обсуждение здесь для получения дополнительной информации: http://gradle.1045684.n5.nabble.com/using-jdbc-driver-in-a-task-fails-td1435189.html

0

Для меня это не сработало (Gradle 2.12).

Но вместо выполнения:

Class.forName("org.h2.Driver") 

я сделал:

groovy.sql.loadDriver("org.h2.Driver") 

Sql.loadDriver метод Groovy делает некоторые отличный материал загрузчика классов.

0

Вы должны использовать что-то вроде этого:

configurations { 
     db2database 
    } 

    buildscript { 
     dependencies { 
      classpath('com.ibm.db2:db2jcc4:10.5.5')//db2 driver for gradle task 
      } 
     } 

     dependencies { 
      db2database "com.ibm.db2:db2jcc4:10.5.5" //db2 driver for configuration 
     } 

     //load drivers for gradle tasks 
     configurations.db2database.each { 
      GroovyObject.class.classLoader.addURL(it.toURI().toURL()) 
     } 

     .... 
     Sql sql = Sql.newInstance(
         envProps.getProperty('dbUri'), 
         envProps.getProperty('dbUsername'), 
         envProps.getProperty('dbPassword'), 
         envProps.getProperty('dbDriverClassName') 
       ) 

       println sql.rows("SELECT * FROM TEST.TEST") 
Смежные вопросы