Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error “can't create Java VM” trying to use Ruby Java Bridge (RJB) gem

I'm trying to implement the Ruby Java Bridge (RJB) gem to talk to JVM so that I can run the Open-NLP gem. I have Java installed and running on Windows 8. All indications, at least those I know of, are that Java is installed and operational. But, attempts to use RJB fail with the message "can't create Java VM". (I do sometimes get "undefined method `dlopen' for Fiddle:Module" in other cases, which is also indecipherable.)

I initially just installed JDK per defaults. Due to my 64-bit system, this installed 64-bit Java. I wasn't sure whether or not Ruby and RJB would talk to this, so I installed the 32-bit JRE. However, the error is the same.

Is there any further test I can run to ensure that JVM is working outside of Ruby?

Can someone tell me what I might need to do to run Windows/Ruby/RJB/JVM?

Thanks...

I am running Windows 8 with BitNami Rubystack and Ruby 1.9.3p448.

Java seems to be available according to testjava.jsp: enter image description here

This is the code, including the URL where I found it:

class FiddleTry

# http://devjete.wordpress.com/2011/01/31/installing-rjb-1-3-4-on-windows-7-32bit-wo-vc/
  require 'rjb'
  out = Rjb::import('java.lang.System').out  <== Line 5 is here
  out.print('Hello Rjb from ')
  p out._classname
end

Here are the error messages:

C:/Users/Richard/RubymineProjects/Utilities/fiddle_try.rb:5:in `import': can't create Java VM (RuntimeError)
    from C:/Users/Richard/RubymineProjects/Utilities/fiddle_try.rb:5:in `<class:FiddleTry>'
    from C:/Users/Richard/RubymineProjects/Utilities/fiddle_try.rb:1:in `<top (required)>'
    from -e:1:in `load'
    from -e:1:in `<main>'

I cannot find any additional information as to why it "can't create Java VM". It would really help if additional information was available to me. I would appreciate either that information or a fix for this. Thanks...

EDIT TO ADD INFORMATION REGARDING OPEN-NLP REQUIREMENT FOR RJB...

This is the code I am trying to run, taken from Github/Open-nlp:

class OpenNlpSample
  ENV['JAVA_HOME'] = "C:/Program Files/Java/jdk1.7.0_25" if ENV['JAVA_HOME'].nil?
  ENV['LD_LIBRARY_PATH'] = "C:/Program Files/Java/jdk1.7.0_25/bin; C:/Program Files (x86)/Java/jre7" if ENV['LD_LIBRARY_PATH'].nil?
  # Load the module
  require 'open-nlp'
  gem_bin = File.join(Gem.loaded_specs['open-nlp'].full_gem_path, 'bin/')
# Set an alternative path to look for the JAR files.
# Default is gem's bin folder.
# OpenNLP.jar_path = '/path_to_jars/'
# OpenNLP.jar_path = File.expand_path('../../ruby/lib/ruby/gems/1.9.1/gems/open-nlp-0.1.4/bin',__FILE__)
  OpenNLP.jar_path = gem_bin
# Set an alternative path to look for the model files.
# Default is gem's bin folder.
# OpenNLP.model_path = '/path_to_models/'
  OpenNLP.model_path = gem_bin
# Pass some alternative arguments to the Java VM.
# Default is ['-Xms512M', '-Xmx1024M'].
# OpenNLP.jvm_args = ['-option1', '-option2']
  OpenNLP.jvm_args = ['-Xms512M', '-Xmx1024M']
# Redirect VM output to log.txt
  OpenNLP.log_file = 'log.txt'
# Set default models for a language.
# OpenNLP.use :language
  OpenNLP.use :english

=begin
  Examples

  Simple tokenizer
=end

  OpenNLP.load

  sent = "The death of the poet was kept from his poems."
  tokenizer = OpenNLP::SimpleTokenizer.new

  tokens = tokenizer.tokenize(sent).to_a
# => %w[The death of the poet was kept from his poems .]


  #Maximum entropy tokenizer, chunker and POS tagger

  OpenNLP.load

  chunker   = OpenNLP::ChunkerME.new
  tokenizer = OpenNLP::TokenizerME.new
  tagger    = OpenNLP::POSTaggerME.new

  sent   = "The death of the poet was kept from his poems."

  tokens = tokenizer.tokenize(sent).to_a
# => %w[The death of the poet was kept from his poems .]

  tags   = tagger.tag(tokens).to_a
# => %w[DT NN IN DT NN VBD VBN IN PRP$ NNS .]

  chunks = chunker.chunk(tokens, tags).to_a
# => %w[B-NP I-NP B-PP B-NP I-NP B-VP I-VP B-PP B-NP I-NP O]


  #Abstract Bottom-Up Parser

  OpenNLP.load

  sent      = "The death of the poet was kept from his poems."
  parser = OpenNLP::Parser.new
  parse = parser.parse(sent)

  parse.get_text.should eql sent

  parse.get_span.get_start.should eql 0
  parse.get_span.get_end.should eql 46
  parse.get_child_count.should eql 1

  child = parse.get_children[0]

  child.text # => "The death of the poet was kept from his poems."
  child.get_child_count # => 3
  child.get_head_index #=> 5
  child.get_type # => "S"


  #Maximum Entropy Name Finder*

                           OpenNLP.load

  text = File.read('./spec/sample.txt').gsub!("\n", "")

  tokenizer   = OpenNLP::TokenizerME.new
  segmenter   = OpenNLP::SentenceDetectorME.new
  ner_models  = ['person', 'time', 'money']

  ner_finders = ner_models.map do |model|
    OpenNLP::NameFinderME.new("en-ner-#{model}.bin")
  end

  sentences = segmenter.sent_detect(text)
  named_entities = []

  sentences.each do |sentence|

    tokens = tokenizer.tokenize(sentence)

    ner_models.each_with_index do |model,i|
      finder = ner_finders[i]
      name_spans = finder.find(tokens)
      name_spans.each do |name_span|
        start = name_span.get_start
        stop  = name_span.get_end-1
        slice = tokens[start..stop].to_a
        named_entities << [slice, model]
      end
    end

  end


=begin
  Loading specific models

  Just pass the name of the model file to the constructor. The gem will search for the file in the OpenNLP.model_path folder.
=end

                                                                                                                          OpenNLP.load

  tokenizer = OpenNLP::TokenizerME.new('en-token.bin')
  tagger = OpenNLP::POSTaggerME.new('en-pos-perceptron.bin')
  name_finder = OpenNLP::NameFinderME.new('en-ner-person.bin')
# etc.


  #Loading specific classes

  #You may want to load specific classes from the OpenNLP library that are not loaded by default. The gem provides an API to do this:

# Default base class is opennlp.tools.
      OpenNLP.load_class('SomeClassName')
# => OpenNLP::SomeClassName

# Here, we specify another base class.
  OpenNLP.load_class('SomeOtherClass', 'opennlp.tools.namefind')
# => OpenNLP::SomeOtherClass



  end

At this point in the code:

=begin
  Examples

  Simple tokenizer
=end

  OpenNLP.load

The call chain is to dl.rb, fiddle.rb and jar_loader.rb. jarloader.rb starting line 43:

# Load Rjb and create Java VM.
def self.init_rjb
  ::Rjb::load(nil, self.jvm_args)
  set_java_logging if self.log_file
end

At this point, I get the same error creating JVM. So, I reverted to attempting to run RJB. The error chain is as follows:

Fast Debugger (ruby-debug-ide 0.4.17, ruby-debug-base19x 0.11.30.pre12) listens on 127.0.0.1:59488
Uncaught exception: can't create Java VM
    D:/BitNami/rubystack-1.9.3-12/ruby/lib/ruby/gems/1.9.1/gems/bind-it-0.2.7/lib/bind-it/jar_loader.rb:45:in `load'
    D:/BitNami/rubystack-1.9.3-12/ruby/lib/ruby/gems/1.9.1/gems/bind-it-0.2.7/lib/bind-it/jar_loader.rb:45:in `init_rjb'
    D:/BitNami/rubystack-1.9.3-12/ruby/lib/ruby/gems/1.9.1/gems/bind-it-0.2.7/lib/bind-it/jar_loader.rb:38:in `load_jar_rjb'
    D:/BitNami/rubystack-1.9.3-12/ruby/lib/ruby/gems/1.9.1/gems/bind-it-0.2.7/lib/bind-it/jar_loader.rb:27:in `load'
    D:/BitNami/rubystack-1.9.3-12/ruby/lib/ruby/gems/1.9.1/gems/bind-it-0.2.7/lib/bind-it/binding.rb:63:in `load_jar'
    D:/BitNami/rubystack-1.9.3-12/ruby/lib/ruby/gems/1.9.1/gems/bind-it-0.2.7/lib/bind-it/binding.rb:71:in `block in load_default_jars'
    D:/BitNami/rubystack-1.9.3-12/ruby/lib/ruby/gems/1.9.1/gems/bind-it-0.2.7/lib/bind-it/binding.rb:68:in `each'
    D:/BitNami/rubystack-1.9.3-12/ruby/lib/ruby/gems/1.9.1/gems/bind-it-0.2.7/lib/bind-it/binding.rb:68:in `load_default_jars'
    D:/BitNami/rubystack-1.9.3-12/ruby/lib/ruby/gems/1.9.1/gems/bind-it-0.2.7/lib/bind-it/binding.rb:55:in `bind'
    D:/BitNami/rubystack-1.9.3-12/ruby/lib/ruby/gems/1.9.1/gems/open-nlp-0.1.4/lib/open-nlp.rb:14:in `load'
    C:/Users/Richard/RubymineProjects/Utilities/open_nlp_sample.rb:32:in `<class:OpenNlpSample>'
    C:/Users/Richard/RubymineProjects/Utilities/open_nlp_sample.rb:1:in `<top (required)>'
like image 806
Richard_G Avatar asked Mar 23 '23 10:03

Richard_G


1 Answers

First, I needed to uninstall Java x64 and install JDK x586 for 32-bit support.

Then, set JAVA_HOME as follows:

JAVA_HOME=C:\Program Files (x86)\Java\jdk1.7.0_40

and add JAVA_HOME to my path:

%JAVA_HOME%\bin;C:\Program Files (x86)\Java\jre7\bin;

This resolved the "can't create Java VM' problem.

Setting $DEBUG=false, or commenting out the line, eliminated all other messages. $DEBUG mode displays error messages that may be caught and resolved so they can be ignored.

After the "can't create Java VM" problem was resolved, all other error messages were of this type and therefore were spurious.

JetBrains support for Rubymine solved this problem for me. They are very good, especially Serge, and I recommend their products because of their support.

like image 144
Richard_G Avatar answered Apr 13 '23 00:04

Richard_G