代码之家  ›  专栏  ›  技术社区  ›  zack

JRuby-jdbc-postgres在从JAR运行时,找不到适合jdbc:postgresql的驱动程序

  •  0
  • zack  · 技术社区  · 11 年前

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

    warbler.rb公司

    包括的宝石

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

    Ruby导入

    require,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中。如有任何建议,我们将不胜感激。

    2 回复  |  直到 11 年前
        1
  •  1
  •   zack    11 年前

    我通过删除jdbc postgres Gem,然后特别包括PostgreSQL JDBCJAR来实现这一点。我提取了相关部分,并省略了一般错误处理和功能。

    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
  •  0
  •   kares    11 年前

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

    推荐文章