0

运行我用 warbler 生成的 jar 时出现“找不到合适的驱动程序”错误。但是,当我将它作为 ruby​​ 运行时,代码会成功。加载驱动程序的命令返回 true,让我相信它仍然可以在 jar 中加载驱动程序。但是,我无法弄清楚为什么 DriverManager.get_connection 会因找不到驱动程序而出错。特别是因为从 Ruby 运行时它成功了。

Ruby 函数被调用

def self.connect(opts)
    connection = nil
    begin
      driver = Jdbc::PostgreSQL.load_driver

      connection = DriverManager.get_connection("jdbc:postgresql://host:port/postgres", opts[:username], opts[:password])
      connection.auto_commit = false
    rescue
       puts $!, $@
       ... 
    end
    connection
  end

运行红宝石

测试连接成功

运行 JAR

找不到适合 jdbc 的驱动程序:postgresql://host:port/postgres java.sql.DriverManager.getConnection(DriverManager.java:602) java.sql.DriverManager.getConnection(DriverManager.java:185)

莺.rb

包括的宝石

config.gems += ["trollop", "builder", "jdbc-postgres"]

红宝石进口

需要,java_import

# All support libraries required to be included
[
  'java',
  'ostruct',
  'trollop',
  'logger',
  'fileutils',
  'yaml',
  'jdbc/postgres'
].each do |require_name|
  require require_name
end


 # All java imported namespaces
    [
        'java.sql.DriverManager'
    ].each do |namespace|
      java_import namespace
    end

似乎有些东西没有进入导致失败的 JAR。任何建议将不胜感激。

4

2 回答 2

1

我通过删除 jdbc-postgres Gem 来完成这项工作,然后特别包括 PostgreSQL JDBC JAR。我提取了相关部分并省略了一般的错误处理和功能。

require postgresql-9.3-1101.jdbc4.jar

Java::JavaClass.for_name "org.postgresql.Driver"
Java::JavaClass.for_name "java.util.Properties"

props = java.util.Properties.new
props.set_property :user, opts[:username]
props.set_property :password, opts[:password]

connection = org.postgresql.Driver.new.connect(get_jdbcurl(opts), props)
于 2014-03-21T11:38:55.070 回答
0

可能 PostreSQL 的驱动程序类没有被初始化(它在 CP 上,但到目前为止没有人使用它)......因此做一些Java::JavaClass.for_name Jdbc::PostgreSQL.driver_name(之前DriverManager.get_connection)将它注册到DriverManager

于 2014-03-20T07:07:40.987 回答