Почему у jruby-openssl gem странная структура папок?

Насколько я понимаю, в структуре папок драгоценного камня должна быть папка lib и внутри этой папки есть <gem-name>.rb файл. Тем не менее, когда я использовал jruby 1.6.8 и делаю bundle install чтобы установить jruby-openssl, я открываю C:\jruby-1.6.8\lib\ruby\gems\1.8\gems\jruby-openssl-0.8.2 и вместо того, чтобы видеть файл rb, я вижу больше подпапок, которые похожи на это:

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' Команда работает. Если gem Команда найти и загрузить драгоценный камень правильно, если папка jruby-openssl находится в LOAD_PATH?



ДЕТАЛИ ОШИБОК:

Вот ошибка, которая появляется в 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

2 ответа

Решение

Чтобы добавить к ответу Тэдмана, если вы посмотрите в gemspec (gems/1.8/specifications/jruby-openssl-0.8.2.gemspec), вы увидите эту строку:

s.require_paths = ["lib/shared"]

Когда ты require 'openssl' в вашем коде, он загрузит один в shared реж. Я считаю, что файл будет определять, загружать ли версию 1.8 или 1.9.

С этим сказал...

Когда я пытаюсь require 'openssl' с 0.8.2 я получаю ошибку:

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

Когда я использую последнюю версию (0.8.8), она работает нормально. Попробуйте обновить.

До версии 1.7.0 JRuby поддержка 1.9 была настолько неполной, что было бы лучше использовать код 1.8. Вероятно, поэтому должно быть две отдельные реализации этой конкретной библиотеки.

Объединять их вместе, как это немного необычно, часто установки 1.8 просто привязываются к более старой версии гема. JRuby представляет собой проблему здесь, и это выглядит как довольно разумное решение.

Другие вопросы по тегам