2010-04-19 2 views
9

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

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

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

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

  1. Установите камень на месте: Java -jar JRuby-комплектно-1.1.6.jar -S камень установить -i ./chronic хроническую --no-RDoc --no-ри
  2. Пакет в банку: банку cf хронический.jar -C хронический.
  3. Написать тестовый скрипт две строки, сохранив его как testt.rb:

    require 'chronic'
    Chronic.parse('tomorrow')

  4. Compile с: jrubyc testt.rb

  5. Выполнить полученный Java класс testt.class следующее (имея как JRuby-complete.jar и chronic.jar в той же папке, что и класс Java): Java -cp:./JRuby-complete.jar: ./ chronic.jar testt

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

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

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

ответ

1

Put это в верхней части тестового сценария:

require 'rubygems'

+0

Роб, спасибо за ваш ответ. Я добавил строку и скомпилировал ее снова, но все еще получаю ошибку, хотя и немного отличается (говорит что-то о пользовательском требовании): java -cp.: ./ jruby-complete.jar: ./ chronic.jar testt Исключение из thread "main": /Users/ave2/NetBeansProjects/jrubywatir/lib/jruby-complete.jar! /META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb: 31: in ' const_missing ': неинициализированный постоянное хроническое (NameError) \t из testt.rb: 3 \t ... внутренний стек JRuby Опущенные ... \t из Module.const_missing (testt.rb: 3) \t из (неизвестно) (. неизвестно) (: 1) – antonio

2

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

+3

Привет, я просто нашел решение, которое, возможно, очевидно для людей с хотя бы некоторыми рубиновыми навыками. Однако все равно стоит упомянуть это где-то для нубов вроде меня. Вот он: , когда вы создаете свой файл jar, он НЕ ДОЛЖЕН иметь такое же базовое имя, что и драгоценный камень, который вы хотите загрузить. В моем случае у меня был файл jar, названный «chronic.jar», и это не сработало. Я просто переименовал его в «chroniclib.jar», добавил, что «rubygems» в моем скрипте, скомпилировал его и запустил с помощью: java -cp.: ./ jruby-complete-1.4.0.jar: .chroniclib.jar testt Он работает! Не нужно требовать .jar внутри скрипта! Крутые камни! :-) – antonio

+0

Кстати, Ник, THX за ваш отличный пост на Gems-in-a-jar, без которого все это было бы невозможно! – antonio

+0

Последнее: проблема существует для меня, только если .jar и скрипт находятся в одной папке. Если я помещу банку в подпапку и отрегулирую путь к java-классу, она будет работать, даже если банка имеет то же имя, что и драгоценный камень. – antonio

Смежные вопросы