我有一个Ruby on Rails应用程序,我希望将其编译/打包为WAR文件以在Tomcat中托管。我已经添加了所有可以找到的相关内容,但WAR似乎只包含了非JRuby版本的gem。结果,我在Tomcat中获得了GemNotFound异常,例如“找不到activerecord-jdbc-adapter”。如果我以7-zip打开WAR文件,它不会在/ WEB-INF / gems / gems下显示任何JRuby或Java宝石。
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文件中明确包含/排除这些gems:
config.gems -= ["sqlite3"]
config.gems += [
"jdbc-sqlite3",
"activerecord-jdbc-adapter",
"activerecord-jdbcsqlite3-adapter",
"jruby-openssl",
"jruby-rack",
"warbler"
]
作为一个有趣的旁注,如果我修改我的Gemfile以要求JRuby宝石,jruby -S bundle install
工作正常,但warble
给出了一系列错误,说明这些宝石仅用于JRuby。另一方面,如果我尝试在JRuby(jruby -S warble
)中运行它,我得到:
战争中止了!没有要加载的文件 - jruby_pageant
我如何说服Warbler我想要JRuby宝石?
修改
我也尝试在gem文件中指定平台,如in this blog post所述,但是这会导致堆栈溢出。
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
版本:
答案 0 :(得分:0)
事实证明我错过了jruby-pageant
宝石。将此添加到捆绑包后,jruby -S warble
生成了预期的输出。