2009-11-19 38 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

相关问题