Я пытаюсь написать некоторый код в 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
Я попробовал в точности показанный там пример с «хроническим» камнем. Идем шаг за шагом:
- Установите камень локально:
java -jar jruby-complete-1.1.6.jar -S gem install -i ./ronic хронический --no-rdoc --no-ri
- Упакуйте его в банку:
jar cfronic.jar -C хронический.
Напишите тестовый скрипт в две строки, сохранив его как testt.rb:
требуется 'хронический'
Chronic.parse ( 'завтра')
Компилировать с: jrubyc testt.rb
- Запустите получившийся класс 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: не упустите шанс превратить неверных! :-) Спасибо.