Rails 5未引用自定义修改的ActiveRecord-jdbc-adapter问题求助
自定义activerecord-jdbc-adapter在Rails 5.2中未加载,仍使用默认代码的排查与解决
问题背景
将应用从Rails 3.2升级至5.2.8.1,此前为连接Progress OpenEdge数据库修改过activerecord-jdbc-adapter,在Rails 3.2下稳定运行。现已生成自定义版本的gem(52.8.xxx)并绑定到Rails 5.2,但系统未加载修改后的src/java/arjdbc/jdbc/RubyJdbcConnection.java,报错行号对应官方未修改源码,推测仍在使用Rails依赖的默认适配器代码。
排查与解决步骤
1. 确认自定义Gem的加载有效性
- 执行
bundle show activerecord-jdbc-adapter,检查输出路径是否指向你的自定义gem目录,而非官方仓库下载版本。 - 若路径不符,需在Gemfile中明确指定自定义gem的本地路径:
gem 'activerecord-jdbc-adapter', '= 52.8.xxxxx', :platform => :jruby, :path => '/本地自定义gem的绝对路径' - 或者先将自定义gem安装到本地JRuby仓库:
再执行gem install /path/to/your/activerecord-jdbc-adapter-52.8.xxxxx.gembundle install锁定版本。
2. 验证Java代码编译与打包完整性
- activerecord-jdbc-adapter的Java代码会编译为jar包,执行以下命令检查修改后的类是否被正确打包:
确认输出中存在jar tf /path/to/your/custom/gem/lib/arjdbc/jdbc/arjdbc-jdbc.jar | grep RubyJdbcConnectionarjdbc/jdbc/RubyJdbcConnection.class,且修改后的jar包大小与官方版本有差异。 - 执行
rake adapters:build时,查看编译日志,确保RubyJdbcConnection.java无编译错误,成功生成class文件。
3. 消除JRuby类缓存干扰
- JRuby会缓存加载过的Java类,清空缓存后重试:
重启Rails控制台后执行rm -rf ~/.jruby/cacheMyModel.first测试。
4. 强制指定Gem加载优先级
- 检查
bundle list输出,确认无其他gem间接引入官方版本的activerecord-jdbc-adapter。若有,执行bundle update activerecord-jdbc-adapter强制更新到自定义版本。 - 可在Gemfile中添加
require: false,手动控制加载时机:
然后在gem 'activerecord-jdbc-adapter', '= 52.8.xxxxx', :platform => :jruby, :require => falseconfig/initializers/jdbc_adapter.rb中手动加载:require 'arjdbc/jdbc'
5. 验证适配器加载来源
- 在Rails控制台中执行以下命令,确认加载的适配器类来自自定义gem:
若路径指向官方gem,需重新检查Gemfile配置与bundle安装结果。# 查看连接配置的适配器 puts ActiveRecord::Base.connection_config[:adapter] # 查看JdbcAdapter类的来源路径 puts ActiveRecord::ConnectionAdapters::JdbcAdapter.instance_method(:initialize).source_location
内容的提问来源于stack exchange,提问作者jpa57
相关产品推荐
相关产品推荐

