2009-11-19 40 views
1

我想寫一個與JRuby的complete.jar像這樣執行的腳本:如何使用jruby-complete.jar註冊JDBC驅動程序?

java -cp derby.jar; -Djdbc.drivers=org.apache.derby.jdbc.EmbeddedDriver -jar jruby-complete.jar -S my_script.rb 

我使用JVM 1.6.0_11和JRuby 1.4。

在我的jruby腳本中,我嘗試像這樣連接到數據庫。

connection = Java::com.sql.DriverManager.getConnection("jdbc:derby:path_to_my_DB") 

這會拋出一個java.sql.SQLException:「找不到合適的驅動程序」異常。

我試過手動將驅動加載到使用Class.forName的類加載器中,這給了我相同的錯誤。

在我看來,DriverManager使用的類加載器與當前線程不一樣。我嘗試設置當前線程的類加載器使用:

JThread = java.lang.Thread 
... 
class_loader = JavaLang::URLClassLoader.new( 
    [JavaLang::URL.new("jar:file:/derby.jar!/")].to_java(
    JavaLang::URL),JRuby.runtime.jruby_class_loader)  

JThread.currentThread().setContextClassLoader(class_loader)  

但是這沒有幫助。

任何想法?

+0

更新: 我也嘗試安裝jruby-complete.jar中的jdbc-derby gem使用: java -jar jruby-complete.jar -S gem install jdbc-derby 這安裝了gem,但JDBC仍然無法加載驅動程序。 – 2009-11-19 19:25:38

回答

2

OK我下載JRuby的complete.jar,有一個去....

這似乎爲我工作:

java -classpath c:\ruby\db-derby-10.5.3.0-bin\lib\derby.jar;jruby-complete-1.4.0.jar org.jruby.Main -S derby.rb 

當使用-jar開關, - classpath選項被忽略(也許CLASSPATH shell var也是)。但是,在上面的行中,我們將兩個必需的jar放在類路徑中,並傳遞類名來執行(即org.jruby.Main)。傳入的腳本與我的其他答案相同。

另一種選擇(我沒試過)是改變了JRuby的complete.jar清單文件中指定的類路徑,如下所述: Adding Classes to the JAR File's Classpath

+0

我剛剛嘗試了「編輯MANIFEST.MF」文件技術,並努力。將MANIFEST.MF文件複製到存檔中。添加以下行:Class-Path:derby.jar 從存檔中刪除舊的MANIFEST.MF文件。把你編輯的文件重新加入jar.exe ufm jruby-complete-1.4.0.jar MANIFEST。MF 然後你可以運行如下:java -jar jruby-complete-1.4.0.jar -S derby.rb – Rob 2009-11-23 00:59:31

+0

這很有效Rob。非常感謝。這個問題真的讓我瘋狂! :) – 2009-11-23 20:01:57

0

首先,確保你的驅動程序jar沒有損壞(這讓我浪費了幾天的時間)。

其次,閱讀有關的JRuby/Java的classloade:JRuby Wiki

三(因爲我還沒有與「JRuby的完整」飾演)試試這個簡單的腳本,然後看看是否是你需要,你可以適應。

require 'java' 
require 'C:\ruby\db-derby-10.5.3.0-bin\lib\derby.jar' # adjust for your machine 
include_class "java.sql.DriverManager" 
derby = org.apache.derby.jdbc.EmbeddedDriver.new 
connection = DriverManager.getConnection("jdbc:derby:derbyDB;create=true")
+0

感謝Rob的建議。如果使用JRuby的本地安裝,您的建議可以工作,但在使用jruby-complete.jar時會失敗。使用jruby-complete時,類加載器的情況會變得非常麻煩。 – 2009-11-20 19:24:20

+0

您是否嘗試了require/include類技術(而不是使用Java :: JavaLang :: URLClassLoader)? – Rob 2009-11-22 23:24:34

相關問題