Выпуск Jruby Gems-in-a-jar - PullRequest
       25

Выпуск Jruby Gems-in-a-jar

9 голосов
/ 19 апреля 2010

Я пытаюсь написать некоторый код в ruby ​​(используя jruby), который будет скомпилирован в байт-код java с jrubyc и развернут на удаленной машине, где он будет работать на JVM (там нет ruby).

Все работает нормально, пока я счастлив придерживаться стандартной библиотеки jruby. Как объясняется на веб-сайте jruby, я просто копирую библиотеку jruby-complete.jar на удаленную машину и включаю ее в путь к классам во время выполнения. Я запускаю свой скомпилированный скрипт, и он работает: круто!

Проблемы начинаются, когда мне нужны другие библиотеки (обычно rubygems) для запуска моего скрипта.
Мне известны такие классные вещи, как rawr, который я успешно протестировал, чтобы собрать все необходимое в одной упаковке. Однако это не то решение, которое я ищу: у меня будет много небольших сценариев, запускаемых независимо, и я не хочу, чтобы каждый из них увеличивался как минимум до 10 МБ только потому, что я безумно включаю jruby-complete.jar в каждый из их.

Я хотел бы скомпилировать файл .jar для каждой библиотеки, которую мне нужно будет использовать, поместить все из них в общую папку на удаленном компьютере и включить их во время выполнения в classpath, когда я запускаю свой скомпилированный jruby-скрипты на JVM.
При этом я пытался следовать инструкциям здесь: http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar
Я попробовал в точности показанный там пример с «хроническим» камнем. Идем шаг за шагом:

  1. Установите камень локально: java -jar jruby-complete-1.1.6.jar -S gem install -i ./ronic хронический --no-rdoc --no-ri
  2. Упакуйте его в банку: jar cfronic.jar -C хронический.
  3. Напишите тестовый скрипт в две строки, сохранив его как testt.rb:

    требуется 'хронический'
    Chronic.parse ( 'завтра')

  4. Компилировать с: jrubyc testt.rb

  5. Запустите получившийся класс java testt.class со следующим (имеющий jruby-complete.jar иronic.jar в той же папке, что и класс java): java -cp.: / jruby-complete.jar: ./ronic.jar testt

Я получаю следующую ошибку:

Исключение в потоке "основной" файл: /Users/ave2/NetBeansProjects/jrubywatir/lib/jruby-complete.jar! /METAINF/jruby.home/lib/ruby/site_ruby/shared/builtin/core_ext/symbol.rb : 1: в `const_missing ': неинициализированная константа Chronic (NameError)
из testt.rb: 2
... внутренний стек jruby исключен ...
из Module.const_missing (testt.rb: 2)
от (неизвестно). (неизвестно) (: 1)

Я действительно не понимаю, что я делаю неправильно, и я полностью застрял в этом. Я новичок в Ruby, гораздо больше привыкший к Python: не упустите шанс превратить неверных! :-) Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010

Из того, что я могу сказать, похоже, что вы не делаете ничего плохого, и вы, вероятно, ошиблись. Можете ли вы попробовать свой пример с более свежим выпуском (http://jruby.org/download)) и, если проблема все еще видна, создайте ошибку в http://bugs.jruby.org/? Спасибо.

1 голос
/ 19 апреля 2010

Поместите это в начало вашего тестового скрипта:

require 'rubygems'

...