在JRuby上安装Neo4j-Devise gem之后的`java.lang.VerifyError:class org.bouncycastle.asn1.ASN1Primitive`

时间:2013-12-30 16:41:01

标签: devise openssl neo4j jruby bouncycastle

我对编程很陌生,并且一直在尝试遵循Team Treehouse教程。然而,在我自己的项目上工作时,我一直在用JRuby和Neo4j构建一个应用程序。到目前为止,我已经设法解决了一些差异,但现在似乎陷入困境。我刚刚安装了Neo4j-Devise宝石,一切都运行正常,但现在每当我尝试启动服务器时,我似乎都会收到此错误......或者做任何有用的事情:

LoadError: load error: jopenssl/load -- java.lang.VerifyError: class org.bouncycastle.asn1.ASN1Primitive overrides final method equals.(Ljava/lang/Object;)Z
require at org/jruby/RubyKernel.java:1083
 (root) at C:/jruby-1.7.9/lib/ruby/gems/shared/gems/jruby-openssl-0.9.4/lib/jruby-openssl.rb:5
require at org/jruby/RubyKernel.java:1083
 (root) at C:/jruby-1.7.9/lib/ruby/gems/shared/gems/bundler-1.3.5/lib/bundler/runtime.rb:1
 each at org/jruby/RubyArray.java:1613
require at C:/jruby-1.7.9/lib/ruby/gems/shared/gems/bundler-1.3.5/lib/bundler/runtime.rb:72
 each at org/jruby/RubyArray.java:1613
require at C:/jruby-1.7.9/lib/ruby/gems/shared/gems/bundler-1.3.5/lib/bundler/runtime.rb:70
require at C:/jruby-1.7.9/lib/ruby/gems/shared/gems/bundler-1.3.5/lib/bundler/runtime.rb:59
require at C:/jruby-1.7.9/lib/ruby/gems/shared/gems/bundler-1.3.5/lib/bundler.rb:132
require at org/jruby/RubyKernel.java:1083
 (root) at C:/Sites/Knock4/config/application.rb:14
  tap at org/jruby/RubyKernel.java:1891
 (root) at C:/jruby-1.7.9/lib/ruby/gems/shared/gems/railties-3.2.16/lib/rails/commands.rb:1
require at org/jruby/RubyKernel.java:1083
 (root) at script/rails:6

我已经阅读了其他一些页面,其中提到类似的错误可能是由于Bouncycastle版本的差异造成的,但我已经尝试过更改它们(至少我认为我有,也许我一直在做错!)我一直都有同样的错误。

非常感谢任何帮助!

gem文件如下:

source 'https://rubygems.org'
gem 'rails', '3.2.16'
gem 'jruby-openssl'
gem 'devise', '2.2.7'
gem 'devise-neo4j', :git => 'git://github.com/cfitz/devise-neo4j.git', :branch => 'devise2'
group :assets do
 gem 'sass-rails',   '~> 3.2.3'
 gem 'coffee-rails', '~> 3.2.1'
 gem 'therubyrhino'
 gem 'uglifier', '>= 1.0.3'
end
gem 'jquery-rails'

group :development, :test do
 gem "rspec-rails"
end

gem "neo4j", ">= 2.2.0"
gem 'neo4j-admin'

1 个答案:

答案 0 :(得分:2)

neo4j-admin-0.2.0-java宝石似乎包括lib/neo4j-admin/jars/bcprov-jdk16-140.jar。解包该JAR表明包含了bouncycastle类。

查看docs for ASN1Primitive,我们可以看到它继承自ASN1Object。在上面的JAR中包含的ASN1Object上运行javap,我们可以看到equals定义为什么(删除了额外的行):

$ javap ASN1Object.class | grep equals
  public final boolean equals(java.lang.Object);

此数据与此related question相关联。查看JAR根目录下的MANIFEST.MF文件,它说

Implementation-Version: 1.40.0

所以JRuby可能包括更新版本的bouncycastle,你有一个提供旧版本的宝石;欢迎来到DLL地狱:-)。我不确定这里最好的解决方案。您可以将bcprov JAR删除为快速黑客,但谁知道可能会做什么。您应该检查是否有更新版本的neo4j宝石可以解决这个问题。如果没有,你应该提交一个bug,以便他们知道(如果还没有)。

修改

这是the bug report。它看起来已经有很长一段时间了。

编辑2

当然,如果您不需要neo4j-admin gem,您可以将其从Gemfile中删除并继续运输。