#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"]
также следует установить