我已经试着解决这个问题3天了,就是找不到解决办法。
所以,我已经下载了Jruby-complete-1.7.3 jar。之后,我尝试使用基本方法安装gem 'nokogiri':java -jar jruby-complete-1.7.3 -S gem install nokogiri
另外,我有一个使用Gem-In-A-Jar方法创建的单独的jar。请注意,这个额外的jar只是试图修复下面的问题的结果。
在这两种情况下,当我通过irb进行测试时,它显示了以下内容:
require 'nokogiri'
=> true
现在,当我试图在我的web应用程序的applet中使用jruby jar时,问题出现了。具体地说,我将提到我可以加载jar本身并从我的applet与它交互,如果我不尝试访问任何gem文件(在本例中特别是nokogiri)。然而,要做到这一点,我需要在罐子上签名。
如果jar是unsigned的,它将无法工作,因为我的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-In-A-Jar方法时,我确实使用了相同的密钥对gem_jar进行签名。
更新:原来我错了。安装的每个gem在lib目录下都有自己的jar文件。这些jar需要用相同的密钥签名。在此之后,上述问题得到了解决。
此外,当我试图在我的web应用程序中运行它时,我得到以下消息:
classpath:/META-INF/jruby.home/lib/ruby/shared/rubygems.rb:396 warning:
can't canonicalize loaded names due to security restrictions; disabling
我认为这是上述错误发生时抛出的异常,但我不能肯定。
我将真诚地感谢任何人可以告诉我我做错了什么,或提供建议如何解决它。如果我的问题措辞错误或没有提供足够的信息,请告诉我。谢谢
一种解决方案是使用SDK工具从每个Jar中剥离签名,并对它们进行最新的数字签名。