この問題を 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 アプリケーション内のアプレットで 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-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
これは、上記のエラーが発生したときにスローされる例外だと思いますが、確かなことは言えません。
私が間違ったことを教えてくれる人、またはそれを修正する方法についての提案を提供できる人に心から感謝します。質問の言い回しが間違っていたり、十分な情報を提供していない場合は、お知らせください。
ありがとう