我有一个 Ruby on Rails 应用程序,我想将它编译/打包为 WAR 文件以托管在 Tomcat 中。我已经添加了所有我能找到的相关内容,但 WAR 似乎只包含非 JRuby 版本的 gem。结果,我在 Tomcat 中得到了 GemNotFound 异常,例如“找不到 activerecord-jdbc-adapter”。如果我在 7-zip 中打开 WAR 文件,它不会显示 /WEB-INF/gems/gems 下的任何 JRuby 或 Java gem。
Warbler 不报告任何错误或警告,并且 WAR 似乎包含它需要的一切,除了这些宝石。
(因为这是一个轻量级的内部应用程序,所以我现在使用 sqlite ......这解释了 sqlite gems。数据库存储在项目外部并在 database.yml 文件中配置。)
我的 Gemfile 中的相关片段:
if defined?(JRUBY_VERSION)
gem 'jdbc-sqlite3'
gem 'activerecord-jdbc-adapter'
gem 'activerecord-jdbcsqlite3-adapter'
gem 'jruby-openssl'
gem 'jruby-rack'
else
gem 'sqlite3'
end
我还尝试在 warble.rb 文件中明确包含/排除这些宝石:
config.gems -= ["sqlite3"]
config.gems += [
"jdbc-sqlite3",
"activerecord-jdbc-adapter",
"activerecord-jdbcsqlite3-adapter",
"jruby-openssl",
"jruby-rack",
"warbler"
]
作为一个有趣的旁注,如果我修改我的 Gemfile 以要求 JRuby gems,jruby -S bundle install
工作正常但warble
会给出一系列错误,说明 gems 仅用于 JRuby。另一方面,如果我尝试在 JRuby ( jruby -S warble
) 中运行它,我会得到:
啁啾中止!
没有要加载的文件——jruby_pageant
如何让 Warbler 相信我想要 JRuby gems?
编辑:
如本文所述,我还尝试在 gemfile 中指定平台,但这会导致堆栈溢出。
platforms :jruby do
gem 'jdbc-sqlite3'
gem 'activerecord-jdbc-adapter', :require => false
gem 'activerecord-jdbcsqlite3-adapter', :require => false
gem 'jruby-openssl'
gem 'jruby-rack'
end
platforms :ruby do
gem 'sqlite3'
end
版本:
- 红宝石 1.9.3
- jruby 1.7.4
- 莺 1.3.8