Почему это не работает: попытка вызвать Ruby GEM из java с помощью JRuby

#java #rubygems #jruby

#java #rubygems #jruby

Вопрос:

Я пытаюсь использовать хронический gem в java через JRuby

Я установил jruby

Я установил хронический gem

 C:>jruby -S gem list --local

*** LOCAL GEMS ***

chronic (0.10.2)
did_you_mean (default: 1.0.1)
jar-dependencies (default: 0.3.5)
...
  

Я подтвердил настройку своей среды

 C:>jruby -S gem env
RubyGems Environment:
  - RUBYGEMS VERSION: 2.6.6
  - RUBY VERSION: 2.3.1 (2016-09-07 patchlevel 0) [java]
  - INSTALLATION DIRECTORY: C:/jruby-9.1.5.0/lib/ruby/gems/shared
  - USER INSTALLATION DIRECTORY: C:/Users/markw/.gem/jruby/2.3.0
  - RUBY EXECUTABLE: C:/jruby-9.1.5.0/bin/jruby.exe
  - EXECUTABLE DIRECTORY: C:/jruby-9.1.5.0/bin
  - SPEC CACHE DIRECTORY: C:/Users/markw/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: C:/jruby-9.1.5.0/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - universal-java-1.8
  - GEM PATHS:
     - C:/jruby-9.1.5.0/lib/ruby/gems/shared
     - C:/Users/markw/.gem/jruby/2.3.0
  - GEM CONFIGURATION:
    ...
  

Я протестировал конфигурацию в IRB от jruby

 irb(main):006:0> require 'chronic'
true
irb(main):007:0> Chronic.parse('tomorrow')
2016-10-22 12:00:00 -0700
  

Выполнение того же вызова jruby через java завершается неудачей:

         ...
       runtime = new ScriptEngineManager().getEngineByName("jruby");
       jruby = new StringBuffer();

       jruby.append("puts 2 3");
       jruby.append("rn");
       jruby.append("require 'chronic'");
       jruby.append("rn");
       jruby.append("Chronic.parse('tomorrow')");

       runtime.eval(jruby.toString());
       ...
  

ВЫВОД:

 5
LoadError: no such file to load -- chronic
  require at org/jruby/RubyKernel.java:956
   <main> at <script>:2
  

Попытка проверить GEM_PATH также работает в irb, но завершается неудачей в java:

         ...
        runtime.eval("Gem.path");
        ...
  

ВЫВОД:

 NoMethodError: undefined method `path' for Gem:Module
  <main> at <script>:1
  

Какие очевидные шаги настройки я пропускаю?

***** ОБНОВИТЬ *****

Отличное предложение EricDuminil. Логически я ожидал, что это сработает, но это не сработало. Вот что я получаю:

Во-первых, я должен упомянуть, что jruby был установлен с помощью установщика Windows. Хронический gem установлен в C:jruby-9.1.5.0librubygemsshared:

 C:jruby-9.1.5.0librubygemsshared>tree /A

 ---build_info
 ---cache
 ---doc
 ---extensions
 ---gems
|    ---chronic-0.10.2
|    ---jruby-win32ole-0.8.5
|    ---rake-10.4.2
|   ---rdoc-4.2.0
...
  

Для GEM.path в IRB установлено значение this:

 irb(main):027:0> Gem.path
["C:/Users/markw/.gem/jruby/2.3.0", "C:/jruby-9.1.5.0/lib/ruby/gems/shared"]
  

Следуя вашему предложению, я установил для ENV [GEM_PATH] значение same (и повторил его для подтверждения):

 jruby.append("ENV["GEM_PATH"] = "C:/Users/markw/.gem/jruby/2.3.0;C:/jruby-9.1.5.0/lib/ruby/gems/shared"");
jruby.append("rn");
jruby.append("puts ENV["GEM_PATH"]");
jruby.append("rn");
  

ВЫВОД:

 C:/Users/markw/.gem/jruby/2.3.0;C:/jruby-9.1.5.0/lib/ruby/gems/shared
LoadError: no such file to load -- chronic
  require at org/jruby/RubyKernel.java:956
   <main> at <script>:3
  

Похоже, что он (jruby) все еще не может его найти!??

Ответ №1:

Вы могли бы определить необходимые переменные среды внутри вашего скрипта ruby, прежде чем требовать chronic.

    jruby.append("ENV["GEM_PATH"] = "C:/Users/markw/.gem/jruby/2.3.0"");
   jruby.append("rn");
  

Я не уверен, какие другие переменные необходимы.

Комментарии:

1. вероятно, ENV["GEM_HOME"] также следует установить