【问题标题】:Why does jruby-openssl gem have strange folder structure?为什么 jruby-openssl gem 有奇怪的文件夹结构?
【发布时间】:2013-05-13 15:34:03
【问题描述】:

据我了解,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' 命令时遇到了问题。如果 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

【问题讨论】:

  • 您能具体说明您遇到的问题吗?

标签: ruby gem jruby jruby-openssl


【解决方案1】:

添加到 tadman 的答案中,如果您查看 gemspec (gems/1.8/specifications/jruby-openssl-0.8.2.gemspec),您会看到这一行:

s.require_paths = ["lib/shared"]

当您在代码中require 'openssl' 时,它会加载shared 目录中的那个。我相信该文件将决定是否加载 1.8 或 1.9 版本。

话虽如此......

当我尝试使用 0.8.2 require 'openssl' 时,出现错误:

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

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

【讨论】:

  • 正是我丢失的那块。为了完成其他人的详细信息,“lib/shared/jruby-openssl.rb”文件有:if RUBY_VERSION &gt;= '1.9.0' $LOAD_PATH.unshift(File.expand_path('../../1.9', __FILE__)) load(File.expand_path('../../1.9/openssl.rb', __FILE__)) else $LOAD_PATH.unshift(File.expand_path('../../1.8', __FILE__)) load(File.expand_path('../../1.8/openssl.rb', __FILE__)) end
【解决方案2】:

在 JRuby 1.7.0 版本之前,对 1.9 的支持非常不完整,因此最好使用 1.8 代码。这可能就是为什么该特定库需要两个单独的实现的原因。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多