无法从JRuby gem访问jar依赖项

时间:2012-01-11 06:03:06

标签: ruby-on-rails jar jruby

我在本地系统上创建了一个用于文本挖掘的gem,它依赖于 用于分类任务的外部Java库。我正试图利用 通过JRuby在这里Java的力量。目录结构如下:

- 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

我正在lib/classifier.rb中加载这些罐子作为

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

我已将此gem添加到Git存储库并在其中引用它 我的Rails 3.0.9项目的Gemfile。但是,我的sample_classifier.rb 未能找到任何来自任何罐子的“进口”类 lib/java

如果我将lib/java复制到我的Rails应用程序

,情况就会有效
lib/ directory

并在sample_classifier.rb中添加以下内容:

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

然而,我不认为溢出宝石是一个好习惯 我的Rails应用程序中的依赖项。有没有更好的方法来实现这一目标?一世 环顾四周用宝石捆绑jar文件,但我找到了结果 恰好相反,即jar文件中的捆绑宝石。我可以添加吗? 这些罐到Rails的config.autoload_path或类似的东西加载时 申请开始了吗?捆绑jar依赖项是一个好习惯 与宝石?

我确信有更简洁的方法可以做到这一点。

2 个答案:

答案 0 :(得分:2)

我可能会建议使用LockJar管理您的Jars会更容易。只需安装宝石

gem install lock_jar

创建一个Jarfile

创建一个包含Jar依赖项列表的Jarfile

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

最简单的jar表示法是 groupId:artifactId:version 。其他受支持的变体是 groupId:artifactId:type:version groupId:artifactId:type:classifier:version

生成Jarfile.lock

使用Jarfile.lock解析,下载并生成传递依赖关系到command line

lockjar lock

(您也可以从Ruby运行它LockJar.lock

访问您的Jars

Jarfile.lock 包含所有Jar依赖项信息。现在,您可以将 Jarfile.lock 中的jar加载到类路径中:

LockJar.load

使用Gem打包时,您需要确保已下载 Jarfile.lock 的Jars:

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

您还可以将宝石设置为download the Jar dependencies when the Gem installs,无需拨打LockJar.install

答案 1 :(得分:0)

使用如下的绝对路径:

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