2

I have a jar dependency for the build.gradle file itself. I'm using this definition:

buildscript {
  repositories {
      flatDir {
          dirs 'lib'
      }
  }
  dependencies {
      classpath name: 'ojdbc16'
  }
}

with this task:

task mytask() << {
    String updateQuery = "somequery"
    println "Setting up test user with query:\n${updateQuery}"
    Sql sql = Sql.newInstance("jdbc:oracle:thin:@//host:port/sid", user, password, 'oracle.jdbc.driver.OracleDriver')
    boolean successful = sql.execute(updateQuery)
}

But I get this exception:

Caused by: org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:452)
    at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:436)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:60)
    ... 54 more
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    at build_5kgfd83hhriam4rhlh34a1l160$_run_closure3.doCall(/Users/localadmin/projects/test-case-runner/build.gradle:41)
    ... 57 more

What could be going on here? I don't get any errors about the classpath definition, so I'm assuming my dependency resolution is working okay. What could be failing?

Stefan Kendall
  • 66,414
  • 68
  • 253
  • 406

2 Answers2

3
repositories {
    flatDir name: 'localRepository', dirs: 'lib'
}

configurations {
    driver
}

task mytask() << {
    URLClassLoader loader = GroovyObject.class.classLoader
    configurations.driver.each {File file ->
        loader.addURL(file.toURL())
    }
    Class driverClass = loader.loadClass('oracle.jdbc.OracleDriver')
    Driver driverInstance = driverClass.newInstance()
    java.sql.DriverManager.registerDriver(driverInstance)

    Sql sql = Sql.newInstance('jdbc-url','username','password')
}
Stefan Kendall
  • 66,414
  • 68
  • 253
  • 406
  • I have been using the same trick for mysql and it works there also: http://stackoverflow.com/questions/6329872/how-to-add-external-jar-files-to-gradle-build-script – thoredge Mar 15 '12 at 07:09
0

Since you are using gradle, you can use groovy to make it shorter and easier to work with as well

def props = [:]
def ds = new BasicDataSource()
ds.with {
    url = props['database.url']
    driverClassName = props['database.driverClassName']
    password = props['database.password']
    username = props['database.username']
}

def sql = new groovy.sql.Sql(ds)
def r = sql.firstRow 'select 1 as val from dual'
println r.val
skipy
  • 4,032
  • 2
  • 23
  • 19