【发布时间】:2013-01-05 22:38:19
【问题描述】:
当通过 jRuby 运行 rails 时,FFI 理解 :size_t,但在使用 Warbler 创建一个 .war 文件并使用 java -jar my_project.war 或 Tomcat 运行该文件之后却不是。
Linux | Windows
-----------------------------+-------------
java -jar works | doesn't work
tomcat works | doesn't work
rails s (using jruby) works | works
Linux 和 Windows 在比较中使用相同的 war 文件。
这是在 Windows 上运行 java -jar 的回溯顶部。 (我在回溯中编辑了文件路径的开头)。
--- Backtrace
TypeError: unable to resolve type 'size_t'
find_type at jar:file:/my_project.war/WEB-INF/lib/jruby-stdlib-1.7.2.jar!/META-INF/jruby.home/lib/ruby/shared/ffi/types.rb:55
type_size at jar:file:/my_project.war/WEB-INF/lib/jruby-stdlib-1.7.2.jar!/META-INF/jruby.home/lib/ruby/shared/ffi/types.rb:147
SQLAnywhere at my_project.war/WEB-INF/gems/gems/sqlanywhere-ffi-1.0.1/lib/sqlanywhere.rb:13
(root) at my_project.war/WEB-INF/gems/gems/sqlanywhere-ffi-1.0.1/lib/sqlanywhere.rb:5
require at org/jruby/RubyKernel.java:1027
当我查看回溯中的文件时,它们列出了各种 c 类型,但没有列出 size_t。
在我看来,jRuby 有 2 个 FFI。
- normal FFI gem.
- jruby-stdlib ffi。
两者最大的区别,好像只有前者懂:size_t。
我的问题是:是否有 2 种不同的 FFI? 如果是这样:我如何确保我的 gem 加载正确的 ffi? 如果不是:我做错了什么?
PS:我是 sqlanywhere-ffi gem 的作者,所以如果问题是我依赖于错误的东西,我可以更改它。目前,它在 gemspec、gemfile 中具有 ffi 作为依赖项,并且在主入口点中具有 requires 'ffi'。
【问题讨论】:
标签: jruby jrubyonrails ffi warbler