Почему у 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 представляет собой проблему здесь, и это выглядит как довольно разумное решение.