我已经尝试解决这个问题 3 天了,但我根本找不到解决方案。
所以,我已经下载了 Jruby-complete-1.7.3 jar。之后,我尝试使用基本方法安装 gem 'nokogiri':
java -jar jruby-complete-1.7.3 -S gem install nokogiri
此外,我有一个单独的 jar,它是使用 Gem-In-A-Jar 方法创建的。请注意,这个额外的 jar 只是尝试解决以下问题的结果。
在这两种情况下,当我通过 irb 对其进行测试时,它都会显示以下内容:
require 'nokogiri'
=> true
现在,当我尝试在我的 Web 应用程序的小程序中使用 jruby jar 时,问题就出现了。具体来说,如果我不尝试访问任何 gem 文件(在这种情况下特别是 nokogiri),我会提到我可以加载 jar 本身并从我的小程序与其交互。但是,要做到这一点,我需要在 jar 上签名。
如果 jar 未签名,则它无法工作,因为我的 Ruby 实例无法创建。签名后,它工作正常。
问题是,一旦对 jar 进行签名,我就会尝试调用之前执行的相同命令,但会出现以下错误:
require 'nokogiri'
LoadError: load error: nokogiri/nokogiri -- java.lang.RuntimeException:
(LoadError) class "nokogiri.EncodingHandler$INVOKDER$s$1$0$get"'s signer
information does not match signer information of other classes in the same
package.
我一直在寻找有关此错误的原因和可能的解决方案,但我无法弄清楚为什么 gem 本身会导致它。在使用 Gem-In-A-Jar 方法时,我确实使用了相同的密钥来签署 gem_jar。
更新:原来我错了。每个安装的 gem 在 lib 目录中都有自己的 jar 文件。这些 jar 需要使用相同的密钥进行签名。完成后,上述问题得到解决。但是,下面的那个仍然存在。
此外,当我尝试在我的网络应用程序中运行它时,我收到以下消息:
classpath:/META-INF/jruby.home/lib/ruby/shared/rubygems.rb:396 warning:
can't canonicalize loaded names due to security restrictions; disabling
我认为这是发生上述错误时抛出的异常,但我不能肯定地说。
我真诚地感谢任何人可以告诉我我做错了什么,或提供有关如何解决它的建议。如果我对问题的表述有误或没有提供足够的信息,请告诉我。
谢谢