【问题标题】:`java.lang.VerifyError: class org.bouncycastle.asn1.ASN1Primitive` after installing Neo4j-Devise gem on JRuby`java.lang.VerifyError: class org.bouncycastle.asn1.ASN1Primitive` 在 JRuby 上安装 Neo4j-Devise gem 后
【发布时间】:2013-12-30 16:41:00
【问题描述】:

我对编程很陌生,一直在努力学习 Team Treehouse 教程。然而,在我自己的项目上工作时,我一直在用 JRuby 和 Neo4j 构建一个应用程序。到目前为止,我已经设法克服了一些差异,但现在似乎被卡住了。我刚刚安装了 Neo4j-Devise gem,一切正常,但现在每当我尝试启动服务器时,我似乎都会收到这个错误......或者做任何有用的事情:

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'

【问题讨论】:

  • 你的 gemfile 是什么样的?
  • 我已将 gemfile 添加到问题中,希望这会有所帮助。不确定您是否意识到@Stefan,但该链接直接链接回这个问题。
  • 请使用您正在运行的命令修改您的问题。如果有多个版本的 bouncycastle 正在加载,那么也许不是运行rails s(例如),您可以尝试bundle exec rails s

标签: devise openssl neo4j jruby bouncycastle


【解决方案1】:

neo4j-admin-0.2.0-java gem 似乎包含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,而您有一个提供较旧版本的 gem;欢迎来到 DLL 地狱 :-)。我不确定这里的最佳解决方案。您可以删除bcprov JAR 作为快速破解,但谁知道这会做什么。您应该检查是否有新版本的 neo4j gem 可以解决这个问题。如果没有,您可能应该向他们提交一个错误,以便他们知道(如果还没有)。

编辑

这里是the bug report。它看起来已经有一段时间没有工作了。

编辑 2

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

【讨论】:

  • 感谢您对问题的研究,看来您已经成功了!我只安装了 neo4j-admin,因为我无法通过命令提示符访问 neo4j 数据库,就像在 Rails 中使用“rails 控制台”访问 SQL 数据库一样。我想没有人知道另一种方法吗?另一方面,尝试从提示中卸载 neo4j-admin gem 也会产生错误,我认为只需将其从 gems 列表中删除就可以了?
  • 我希望您可以通过从 Gemfile 中删除该行来停止使用 gem,然后运行 ​​bundle。然后,除非有其他需要,否则不应再加载该 gem。您可以在Gemfile.lock 中查看该案例。
  • 在尝试卸载 neo4j-admin gem 或将其从 gemfile 中删除并运行 bundle 时,我似乎仍然遇到相同的错误。
  • 为了以后的参考,卸载这个 gem 花了很多时间。在重新安装之前,我必须完全卸载 JDK、JRuby、Ruby 和 Rails,而没有任何文档中引用的 neo4j-admin。虽然我认为只需要 JDK 和 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
  • 1970-01-01
相关资源
最近更新 更多