【问题标题】:JRuby - jdbc-postgres no suitable driver found for jdbc:postgresql when running from JARJRuby - 从 JAR 运行时,jdbc-postgres 找不到适用于 jdbc:postgresql 的驱动程序
【发布时间】:2014-03-21 19:38:55
【问题描述】:

在运行我用 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

运行 Ruby

测试连接成功

运行 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"]

Ruby 导入

要求,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。任何建议将不胜感激。

【问题讨论】:

    标签: ruby jruby warbler jdbc-postgres


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢,我添加了初始化调用,没有任何变化,我最终尝试了一堆调用以确保驱动程序正在加载。在 JAR 中,一切都以同样的异常结束。我最终改变了我使用 org.postgresql.Driver 类的方式来让它工作。
      猜你喜欢
      • 2021-12-05
      • 2018-11-30
      • 1970-01-01
      • 2022-09-26
      • 2020-12-13
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多