无法从JRuby gem访问jar依赖项

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

- 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加载这些jar

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

我已将此gem添加到Git存储库并在我的Rails 3.0.9项目的Gemfile中引用它。 但是,我的sample_classifier.rb无法找到从lib/java下的任何jar中导入的任何类。

如果我将lib/java复制到我的Rails应用程序,事情就有效

 lib/ directory 

并在sample_classifier.rb添加以下sample_classifier.rb

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

但是,我不认为在我的Rails应用程序中溢出gem的依赖项是一个好习惯。 有没有更好的方法来实现这一目标? 我环顾四周寻找带有gem的jar文件,但我找到了完全相反的结果,即在jar文件中捆绑gem。 我可以将这些jar添加到Rails的config.autoload_path或类似的东西,以便在应用程序启动时加载它们吗? 将jar依赖项与gem捆绑在一起是一个好习惯吗?

我敢肯定有一个更清洁的方法来做到这一点。

我可能会建议用LockJar管理你的Jars会更容易。 只需安装gem

 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:versiongroupId:artifactId:type:classifier:version

生成Jarfile.lock

使用命令行解决,下载传递依赖关系并生成Jarfile.lock :

 lockjar lock 

(你也可以从Ruby运行它作为LockJar.lock )

访问你的jar子

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

 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 

您还可以设置Gem以在Gem安装时下载Jar依赖项 ,从而无需调用LockJar.install

像这样使用绝对路径:

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