0

ユーザー アカウントしか持っていないマシンで、ジョブの出力をテキスト ファイルではなく sqlite データベースにダンプしたいと考えています。このために、jarfile から jruby を実行します。

ローカルからgems ( dbi, dbd/Jdbc, jdbc/sqlite3) を使用するアプローチは機能GEM_HOMEせず (適切なドライバーが見つかりません)、gem からの非推奨メッセージも生成されます (「include_class is deprecated. Use java_import.」)。

Zentus の sqlitejdbc-v056.jar を参照し、パスに Zentus を指定して JRuby を実行しました。

java -cp .:sqlitejdbc-v056.jar -jar jruby-complete-1.7.0.preview1.jar test.rb

test.rb はhttp://www.zentus.com/sqlitejdbc/に触発され、JRuby で SQLite3 JDBC ドライバーを初期化する方法は? :

require 'java'
require '/home/jens/jruby/sqlitejdbc-v056.jar'

org.sqlite.JDBC                 # load the driver so DriverManager detects it 
p clazz = Java::JavaClass.for_name("org.sqlite.JDBC")
java.sql.DriverManager.registerDriver( clazz )
#Java::OrgSqlite::JDBC          # alternate means of same

puts "enumerating..."
java.sql.DriverManager.getDrivers.each{ |e| puts e }

connection = java.sql.DriverManager.getConnection 'jdbc:sqlite:/home/jens/jruby/test.db'
begin
  statement = connection.createStatement
  ...
ensure
  connection.close
end

これから得られる出力は次のとおりです。

class org.sqlite.JDBC
enumerating...
sun.jdbc.odbc.JdbcOdbcDriver@73415727
DriverManager.java:602:in `getConnection': java.sql.SQLException: No suitable driver found for jdbc:sqlite:/home/jens/jruby/test.db
from DriverManager.java:207:in `getConnection'
from NativeMethodAccessorImpl.java:-2:in `invoke0'
    ...

不思議なことに、ドライバーは DriverManager によって一覧表示されますが、sqlite に適しているとは見なされません。

提案をお待ちしております。

4

1 に答える 1

0

まず、gem の依存関係を管理するために bundler を使用する必要があります。Bundler は Gemfile を使用して、必要な gem をリストします (スクリプトがある場所に配置します)。そして、jruby がパスにあることを確認してください。

あなたの場合、Gemfile には以下が含まれている必要があります。

source 'http://rubygems.org'

gem "activerecord-jdbcsqlite3-adapter", ">= 1.2"

次に実行します。

bundle install --path vendor/bundle

次に、スクリプトを次のように変更します。

require 'rubygems'
require "java"
require 'bundler/setup'
require 'jdbc/sqlite3'

Bundler.require
org.sqlite.JDBC                 # load the driver so DriverManager detects it 
p clazz = Java::JavaClass.for_name("org.sqlite.JDBC")
java.sql.DriverManager.registerDriver( clazz )

puts "enumerating..."
java.sql.DriverManager.getDrivers.each{ |e| puts e }

connection = java.sql.DriverManager.getConnection 'jdbc:sqlite:/home/jens/jruby/test.db'
begin
  statement = connection.createStatement
ensure
  connection.close
end
于 2012-07-18T19:16:37.327 に答える