GrabでJDBCドライバを読み込めない
Groovyのjiraにもあがっているのですが、GroovySQLを使うときにGrabでドライバを取ってこようとして
@Grab('postgresql:postgresql:8.4-701.jdbc3') import groovy.sql.Sql Sql.newInstance('jdbc:postgresql://localhost:5432/database', 'user', 'password', 'org.postgresql.Driver' ).with { eachRow("select * from table", {println it}) }
とやってもjava.lang.ClassNotFoundExceptionが発生してしまいます。JDBCドライバをシステムクラスローダに探しに行ってしまって、Grabで入れたクラスは見つからないのです。
…と、このあと回避法を書いてたんですが、1.7-beta2で入ったらしい正しい対処法をコメントで教えてもらいました!
GrabConfigでシステムクラスローダに追加するようにできますよ。
@Grapes([ @Grab('postgresql:postgresql:8.4-701.jdbc3'), @GrabConfig(systemClassLoader=true) ])
1.7使ってるんならこうすりゃええんですね。ふむふむ。
てわけで、以下みたいな裏ワザはいりませんでした。まぁなんかの理由で1.6以前のGroovy使わなあかん時には必要なので、一応残しときます。
てもGrabの位置が1.7仕様なのでそのままでは使えませんが…
そこで、Sql.newInstanceとする前に
this.class.classLoader.getURLs().each{ ClassLoader.systemClassLoader.addURL(it); }としてやると、うまく動きます。
または、DataSourceを使ってSqlのインスタンスを明示的にnewしても動きます。@Grab('postgresql:postgresql:8.4-701.jdbc3') import org.postgresql.ds.PGSimpleDataSource import groovy.sql.Sql new Sql(new PGSimpleDataSource( serverName: 'localhost', databaseName: 'database', user: 'user', password: 'password' )).with { eachRow("select * from table", {println it}) }
次にはまらないためのメモ。