Статьи

10 горячих советов для JRuby

Владимир Сизиков любезно поделился этими десятью советами по кодированию для Juby, реализации Ruby для JVM, сообществу DZone. Сизиков является основным участником проекта JRuby. Он является инженером-программистом в Sun Microsystems , с более чем 9-летним опытом тестирования соответствия и совместимости для платформ Java SE и Java ME. Владимир также является техническим руководителем проекта ME Framework .  

Вот его советы, которые он собирал со временем. Они в основном с точки зрения инженера службы поддержки, отвечая на вопросы пользователей и пытаясь решить их самые частые проблемы:

1. Ключ командной строки -d — ваш (самый большой) друг.Много, много раз, это помогло намного легче определить проблему, когда «require» не выполняется, или когда вам нужно загрузить некоторые классы Java, и все, что вы получаете, это небольшая трассировка исключения. jRuby -d включает полные трассировки стека с большим количеством дополнительных данных (трассировки стека java от внутренних компонентов jruby). Часто это показывает основную причину проблемы. Итак, это первое, что нужно попробовать, когда у вас есть проблемы с загрузкой классов и неясны причины. (См. Также Совет № 9, в котором предлагается JRuby 1.5).

2. Обнаружение платформы. Я видел этот вопрос много раз. Поскольку в JRuby константа RUBY_PLATFORM всегда является «java», пользователям неясно, как определить базовую платформу. С модулем rbconfig это довольно просто, JRuby полностью его поддерживает:
   require ‘rbconfig’
   Config :: CONFIG [‘host_os’] # возвращает mswin32
в Windows, например.

В Config :: CONFIG есть много дополнительной информации , просто распечатайте ее, чтобы увидеть.

3. Правильное определение ОС / платформы, которое работает в различных реализациях Ruby (включая JRuby).   Это очень частая проблема, которая часто кусает пользователей JRuby. Обычно в MRI для обнаружения, скажем, Windows используется следующий код:

   RUBY_PLATFORM = ~ / mswin /

Это не будет работать на JRuby (помните, что RUBY_PLATFORM в JRuby всегда ‘java’)! Правильный способ — использовать модуль rbconfig. Измените ваш код и доведите его до сведения авторов используемых вами гемов / библиотек. Эта простая вещь играет серьезную роль в уменьшении несовместимости и ошибок с JRuby (особенно в Windows). Для более подробной информации, посмотрите здесь .

4. Обнаружение, если текущий код выполняется JRuby. Есть несколько способов сделать это. Пожалуйста, обратитесь к следующему сообщению, Я видел случаи № 1 и № 3, используемые чаще всего. # 1 на самом деле не рекомендуется, поскольку действительное значение RUBY_PLATFORM не гарантирует, что оно останется «java». Итак, № 3 — самый простой и рекомендуемый подход. Если определено, JRUBY_VERSION. И # 2 — это стандартный способ кросс-реализации, поскольку его можно использовать для выполнения аналогичных проверок в отношении Rubinius, IronRuby и MRI (хотя MRI начал поддерживать это только с версии 1.9+).

5. Интеграция Java. Это, наверное, самая частая тема для обсуждения. У JRuby Wiki есть страница, посвященная этому. Кроме того, для более сложных деталей я всегда рекомендую изучить спецификации интеграции JRuby в JavaВы получите много интересного и нового. Например, вы хотите знать, как преобразовать массив Java в Ruby. Взгляните на types / array_spec.rb , вы увидите, например:
   
   [true, false] .to_java: boolean

И, если есть что-то, что вы хотели бы видеть реализованным на уровне интеграции Java в JRuby, рассмотрите возможность добавления спецификаций. это самый полезный способ.

6.
Знаете ли вы, что JRuby теперь может легко вызывать нативные функции C, благодаря FFI?   Смотрите примеры здесь . В JRuby 1.5 все станет еще лучше, мы будем полностью поддерживать библиотеки Win32API, win32 / resolv и win32 / registly. Все они работают поверх JRuby. И благодаря проекту ruby-ffiТеперь появилась прекрасная возможность писать гем / библиотеки кросс-реализации, которые обращаются к нативному уровню, и они будут работать как на MRI, так и на JRuby, а также на любой другой реализации Ruby, которая будет поддерживать ffi.

7. JRuby и более новые рельсы / activerecord-jdbc . Больше нет необходимости настраивать database.yml с помощью информации, специфичной для JRuby. Конфигурация базы данных остается неизменной для MRI и JRuby. Все, что нужно сделать пользователям, это вызвать: jruby script / generate jdbc . Для более подробной информации, посмотрите и блог Ника Сигера об этом. Это новый подход, и пользователи должны знать об этом и корректировать свои привычки. 

* Последние три подсказки — некоторые подсказки для будущей версии JRuby 1.5 *
   
8. [Функция уровня JRuby 1.5] Хотите узнать, как быстро / медленно JRuby загружает гемы / библиотеки? Попробуй это:

jruby -b -J-Djruby.debug.loadService.timing=true -e "require 'rubygems'"

  Вы получите вывод, как это :

#>jruby -b -J-Djruby.debug.loadService.timing=true script\server
-> builtin/core_ext/symbol
<- builtin/core_ext/symbol - 35ms
-> enumerator
<- enumerator - 6ms
-> D:/work/jruby-dev/rails/xxx/config/boot
-> rubygems
-> rubygems/defaults
<- rubygems/defaults - 5ms
-> thread
<- thread - 7ms
-> etc
<- etc - 5ms
-> rbconfig
<- rbconfig - 7ms
-> rubygems/exceptions
<- rubygems/exceptions - 5ms
-> rubygems/version
-> rubygems/requirement
<- rubygems/requirement - 6ms

9. [Функция уровня JRuby 1.5] Хотите узнать, что / где JRuby загружает / требует библиотеки, попробуйте:

jruby -J-Djruby.debug.loadService=true -e "require 'yaml'"

Вы получите вывод, как это :

jruby -J-Djruby.debug.loadService=true -e "require 'yaml'"

LoadService: trying builtinLib: builtin/core_ext/symbol.class
LoadService: trying builtinLib: builtin/core_ext/symbol.rb
LoadService: trying resourceFromLoadPath: D:/work/jruby-dev/jruby/lib/ruby/site_ruby/1.8/builtin/core_ext/symbol.class
LoadService: trying resourceFromLoadPath: D:/work/jruby-dev/jruby/lib/ruby/site_ruby/1.8/builtin/core_ext/symbol.rb
LoadService: trying resourceFromLoadPath: D:/work/jruby-dev/jruby/lib/ruby/site_ruby/shared/builtin/core_ext/symbol.class
LoadService: trying resourceFromLoadPath: D:/work/jruby-dev/jruby/lib/ruby/site_ruby/shared/builtin/core_ext/symbol.rb
LoadService: found: file:/D:/work/jruby-dev/jruby/lib/ruby/site_ruby/shared/builtin/core_ext/symbol.rb
LoadService: trying builtinLib: enumerator.class
LoadService: trying builtinLib: enumerator.rb
LoadService: trying resourceFromLoadPath: D:/work/jruby-dev/jruby/lib/ruby/site_ruby/1.8/enumerator.class
LoadService: trying resourceFromLoadPath: D:/work/jruby-dev/jruby/lib/ruby/site_ruby/1.8/enumerator.rb

10. [Функция уровня JRuby 1.5] Возникли проблемы при запуске JRuby в Windows? Попробуйте запустить jruby.exe -Xtrace output.log . И взгляните на обширный вывод журнала в файле output.log .

И, наконец, что не менее важно, если у вас есть еще вопросы, задавайте их через список рассылки JRuby
и / или через IRC — это самый быстрый способ получить ответы.  Регистрация ошибок JRuby также является важной частью процесса.

Эти советы были созданы Владимиром Сизиковым .