无法从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:version和groupId: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