Владимир Сизиков любезно поделился этими десятью советами по кодированию для 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 также является важной частью процесса.
Эти советы были созданы Владимиром Сизиковым .