我在本地系统上创建了一个用于文本挖掘的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依赖项是一个好习惯 与宝石?
我确信有更简洁的方法可以做到这一点。
答案 0 :(得分:2)
我可能会建议使用LockJar管理您的Jars会更容易。只需安装宝石
gem install lock_jar
创建一个包含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解析,下载并生成传递依赖关系到command line:
lockjar lock
(您也可以从Ruby运行它LockJar.lock)
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