2015-06-12 35 views
1

以下Groovy腳本可以從命令行正常工作。 (我順利拿到連接。)爲什麼在GroovyConsole中DriverManager.getConnection()查找失敗?

// ---- jdbc_test.groovy 
import java.sql.* 
Class.forName("com.mysql.jdbc.Driver") 
def con = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/test", 
    "root", 
    "password") 
println con 

> groovy -cp lib\mysql-connector-java-5.1.25-bin.jar script\jdbc_test.groovy 
[email protected] 

但如果同一個腳本被加載到groovyConsole中(2.4.3),然後運行 ​​- 使用「腳本」添加mysql-connector-java-5.1.25-bin.jar後| 「罐(S)添加到類路徑」 - 失敗:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/test 
at java_sql_DriverManager$getConnection.call(Unknown Source) 
at jdbc_test.run(jdbc_test.groovy:3) 

我已經加入到groovyConsole中的類路徑,並已嘗試工作每隔包或類。 Groovy的類加載和DriverManager的工作方式有一些意外的交互作用嗎?

有沒有辦法解決這個問題?我試圖用GroovyConsole交互地測試一些JDBC代碼(一個函數庫,每個函數都以Connection作爲第一個參數)。

更新:Class.forName()部分似乎工作正常。如果我'腳本'| 「清除腳本上下文」,然後重新運行在groovyConsole中的腳本,我反而得到:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 

如果我回到加mysql-connector-java-5.1.25-bin.jar,我回去讓:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/test 

回答

2

解決方案:肇事司機已在類路徑上。

原因: 如果你看看DriverManager類,你會發現這樣的代碼:Class.forName(driver.getClass().getName(), true, classLoader);。這是爲了檢查驅動程序是否可以從類加載器上下文中訪問。這個上下文是通過回到調用DriverManager的類來確定的。此代碼是爲Java編寫的,因此會在調用堆棧上假設一定數量的幀返回。由於Groovy不會直接調用(除非使用@CompileStatic),否則此編號是錯誤的,並且通常會導致選擇Groovy核心類,從而導致Groovy主要加載器被選中....在過去,這通常甚至是由於反射,JDK系統類加載器。所以,即使驅動程序已加載並註冊,您無法訪問它。

注:與jdbc4駕駛員應自行註冊,只是被放在classpath

+0

感謝。這很好地解釋了它。使GroovyConsole可用的驅動程序jar文件最簡潔的方法似乎是將其放到'{user.home} /。groovy/lib'中。這是Groovy的「conf/groovy-starter.conf」中包含的位置之一。 – Paul

+0

感謝您的回答!我沒有將驅動程序jar放在classpath上,而是通過用Java編寫的類來代理對DriverManager的調用,這似乎也能正常工作。 – David