Невозможно получить доступ к jar-зависимостям из гема JRuby - PullRequest
1 голос
/ 11 января 2012

Я создал драгоценный камень в моей локальной системе для интеллектуального анализа текста, который использует внешние библиотеки Java для задач классификации.Я пытаюсь использовать мощь Java через JRuby здесь.Структура каталогов выглядит следующим образом:

- classifier/
 * classifier.gemspec
 * Gemfile
 * Gemfile.lock
 * lib/
     * classifier/
         * version.rb
         * sample_classifier.rb
     * classifier.rb
     * java/
         * sample_lib.jar
         * another_sample_lib.jar
         * yet_another_sample_lib.jar
 * Rakefile

Я загружаю эти jar-файлы в lib/classifier.rb как

Dir["java/*.jar"].each{|jar| require jar}

Я добавил этот гем в репозиторий Git и сослался на него в Gemfileмоего проекта Rails 3.0.9.Тем не менее, мой sample_classifier.rb не может найти любые классы, импортируемые из любого из jar-файлов в lib/java.

Все будет работать, если я скопирую lib/java в мое приложение Rails

lib/ directory

и добавьте следующее в sample_classifier.rb:

Dir["lib/java/*.jar"].each{|jar| require jar}

Однако я не думаю, что это хорошая практика - выкладывать зависимости гема в моем приложении Rails.Есть ли лучший способ добиться этого?Я искал для объединения jar-файлов с гемом, но я нашел результаты для совершенно противоположного, то есть для объединения гемов внутри jar-файла.Могу ли я добавить эти jar-файлы в config.autoload_path Rails или аналогичные, чтобы загрузить их при запуске приложения?Является ли хорошей практикой объединять зависимости jar с гемом?

Я уверен, что есть более чистый способ сделать это.

Ответы [ 2 ]

2 голосов
/ 10 сентября 2012

Могу ли я предположить, что управлять вашими банками с LockJar было бы проще.Просто установите gem

gem install lock_jar

Создайте Jarfile

Создайте Jarfile , который содержит список ваших зависимостей Jar:

jar "com.tobedevoured:example1:0.0.1"
jar "com.tobedevoured:example2:0.0.2"
jar "com.tobedevoured:example3:0.0.3"

простейшая система обозначений jar - groupId: artifactId: версия .Другие поддерживаемые варианты: groupId: artifactId: тип: версия и groupId: artifactId: тип: классификатор: версия .

Создание файла Jarfile.lock

Транзитивные зависимости разрешаются, загружаются и генерируются в Jarfile.lock с командной строкой :

lockjar lock

(Вы также можете запустить его из Rubyas LockJar.lock )

Доступ к вашим Jar-файлам

Jarfile.lock содержит всю информацию о зависимостях Jar.Теперь вы можете загрузить свои банки из Jarfile.lock в путь к классам с помощью:

LockJar.load

При упаковке с самоцветом вам нужно будет обеспечить банки из Jarfile.Блокировка была загружена с:

LockJar.install

Убедитесь, что вы запрашиваете Jarfile.lock относительно установленного каталога Gem.Вот пример помощника:

module Example
  def self.installHelper
    # get jarfile relative the gem dir from lib/example.rb
    lockfile = File.expand_path( "../../Jarfile.lock", __FILE__ ) 

    LockJar.install( :lockfile => lockfile )
  end

  def self.loadHelper
    # get jarfile relative the gem dir from lib/example.rb
    lockfile = File.expand_path( "../../Jarfile.lock", __FILE__ ) 

    LockJar.load( :lockfile => lockfile )
  end
end

Вы также можете настроить свой Gem на загрузку зависимостей Jar при установке Gem , избавляя от необходимости вызывать LockJar.install.

0 голосов
/ 15 января 2012

Используйте абсолютные пути, например, так:

jars_dir = File.join(File.dirname(__FILE__), 'java')
for jar in Dir["#{jars_dir}/*.jar"]
  require jar
end
...