2013-05-13 63 views
2

从我的理解中,宝石文件夹structer应该有一个名为lib的文件夹,并在该文件夹中有一个<gem-name>.rb文件。然而,当我用的JRuby 1.6.8bundle install安装JRuby的OpenSSL的,我打开了C:\jruby-1.6.8\lib\ruby\gems\1.8\gems\jruby-openssl-0.8.2和看到的不是一个RB文件,我看到这个样子多个子文件夹:为什么jruby-openssl gem有奇怪的文件夹结构?

jruby-openssl-0.8.2\ 
+---lib\ 
| +---1.8\ 
| | +---openssl\ 
| | +---openssl.rb 
| +---1.9\ 
| | +---openssl\ 
| | +---openssl.rb 
| +---ruby\ 
| | +---shared\ 
| +---shared\ 
|  +---jopenssl\ 
|  +---openssl\ 
|  +---openssl.rb 
+---test\ 
    +---java\ 

是有一个原因,jruby-openssl没有遵循标准的gem文件夹结构?具体来说,我似乎遇到了一个gem 'jruby-openssl'命令工作的麻烦。如果jruby-openssl文件夹位于LOAD_PATH中,gem命令是否应该正确地找到并加载gem?



错误详细信息:

这里是出现在C:\apachetomcat632\logs\MyWebapp.log

--- Backtrace 
LoadError: OpenSSL::Cipher requires the jruby-openssl gem 
      (root) at file:/C:/apachetomcat632/shared/lib/jruby-complete.jar!/META-INF/jruby.home/lib/ruby/site_ruby/shared/jruby/openssl/autoloads/cipher.rb:8 
    MessageEncryptor at file:/C:/apachetomcat632/shared/lib/jruby-complete.jar!/META-INF/jruby.home/lib/ruby/site_ruby/shared/jruby/openssl/autoloads/cipher.rb:24 
    ActiveSupport at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/activesupport-3.2.11/lib/active_support/message_encryptor.rb:12 
      (root) at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/activesupport-3.2.11/lib/active_support/message_encryptor.rb:4 
      require at org/jruby/RubyKernel.java:1062 
      require at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/activesupport-3.2.11/lib/active_support/dependencies.rb:251 
    load_dependency at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/activesupport-3.2.11/lib/active_support/dependencies.rb:236 
      require at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/activesupport-3.2.11/lib/active_support/dependencies.rb:251 
    eager_autoload! at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/activesupport-3.2.11/lib/active_support/message_encryptor.rb:43 
       each at org/jruby/RubyArray.java:1620 
    eager_autoload! at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/activesupport-3.2.11/lib/active_support/dependencies/autoload.rb:43 
     Bootstrap at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/railties-3.2.11/lib/rails/application/bootstrap.rb:20 
    instance_exec at org/jruby/RubyKernel.java:2091 
       run at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/railties-3.2.11/lib/rails/initializable.rb:30 
    run_initializers at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/railties-3.2.11/lib/rails/initializable.rb:55 
       each at org/jruby/RubyArray.java:1620 
    run_initializers at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/railties-3.2.11/lib/rails/initializable.rb:54 
     initialize! at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/railties-3.2.11/lib/rails/application.rb:136 
       send at org/jruby/RubyKernel.java:2105 
    method_missing at file:C:/apachetomcat632/shared/lib/cfe-gems.jar!/gems/railties-3.2.11/lib/rails/railtie/configurable.rb:30 
      (root) at C:/apachetomcat632/webapps/Bank62P/WEB-INF/rails/config/environment.rb:5 
      require at org/jruby/RubyKernel.java:1062 
    load_environment at C:/apachetomcat632/webapps/Bank62P/WEB-INF/rails/config/environment.rb:23 
    load_environment at file:/C:/apachetomcat632/shared/lib/jruby-rack.jar!/jruby/rack/rails_booter.rb:65 
      (root) at <script>:1 

而且这里的错误是整个cipher.rb文件:

require 'rubygems' 

# try to activate jruby-openssl gem for OpenSSL::SSL, raising error if gem not present 
begin 
    gem 'jruby-openssl' 
    require 'openssl.rb' 
rescue Gem::LoadError => e 
    raise LoadError.new("OpenSSL::Cipher requires the jruby-openssl gem") 
end 
+0

你能更具体地处理你遇到的麻烦吗? – Kelvin 2013-05-13 16:05:21

回答

2

为了增加tadman的答案,如果你在gemspec(gems/1.8/specifications/jruby-openssl-0.8.2.gemspec)看,你会看到这样一行:

s.require_paths = ["lib/shared"] 

当你require 'openssl'在你的代码,它会在shared加载一个DIR。我相信该文件将决定是否加载1.8或1.9版本。

虽这么说......

当我尝试require 'openssl'与0.8.2,我得到一个错误:

LoadError: no such file to load -- openssl/dummy 

当我使用最新版本(0.8.8),它工作正常。尝试升级。

+0

恰恰是我失踪的那部分。要完成其他人的详细信息,“lib/shared/jruby-openssl.rb”文件具有以下内容:'if RUBY_VERSION> ='1.9.0' $ LOAD_PATH.unshift(File.expand_path('../ .. /1.9' ,__FILE__)) 负载(File.expand_path( '../../ 1.9/openssl.rb',__FILE__)) 其他 $ LOAD_PATH.unshift(File.expand_path(” ../../ 1.8',__FILE__)) load(File.expand_path('../../ 1.8/openssl.rb',__FILE__)) end' – 2013-05-13 18:02:34

0

之前JRuby的1.7.0版本,1.9的支持是不完整的,你最好使用1.8代码。这可能是为什么这需要两个独立的特定库的实现。

像这样将它们捆绑在一起有点不同寻常,1.8版本的安装只会锁定旧版本的宝石。 JRuby在这里提出了一个挑战,这看起来像一个相当合理的解决方案。