JRuby+Java:如何在我的 jar 中找到我本地安装的 Gems

JRuby+Java: How to find my locally installed Gems in my jar

(交叉贴:这个问题两周前也在 JRuby forum 上发过,但是没有人回答)

我在 Windows,JRuby 1.7.23(但我认为这对 这个问题)。

我的项目目录有以下子目录:

也就是说,我使用的是本地 gem 目录,而不是默认位置。

我用

安装 gem
jruby -S gem install GEMNAME --install-dir ./gem

并将环境变量GEM_HOME设置为我的./gem目录

如果我有一个纯 JRuby 应用程序,它会找到我安装的 gems(我试过这个)。问题是我有一个混合的 Java+JRuby 应用程序,它应该是来自 jar 文件的 运行。我正在这样创建我的 jar 文件:

jar cvfm app.jar manifest.mf -C . Main.class javas\*.class rubies gem

如我所见,它很好地将我的 gem 打包到 jar 文件中。当我 运行 我的申请

java -cp c:\jruby\jruby.jar;app.jar Main

当我需要我安装的 gem 之一时出现异常,说找不到 Gem - 这并不奇怪,因为 GEM_HOME 没有当应用程序是来自 jar 文件的 运行 时有什么意义,不是吗?

我需要一种不同的方式来告诉我的应用程序,在哪里可以找到 Gem。在这种情况下最好的方法是什么?我是否应该显式操纵 $LOAD_PATH,如果是,如何操纵?或者我可以设置 GEM_HOME 以使其指向 jar 中的 Gem 目录吗?

UPDATE:我想我找到了解决问题的方法,但看起来有点麻烦,我想知道是否有更好的方法。无论如何,这是我想出的解决方案:

我知道所有需要的gem都在我的jar文件里,在相对目录'gem'下面。我还知道 Ruby 源位于路径下方某处名为 lib 的目录中(例如,gem/gems/GEMNAME/lib/GEMNAME.rb)。因此,我从顶级目录 (gem) 开始遍历目录树,并在执行任何 require 之前将 lib 目录 (gem/gems/GEMNAME/lib) 的所有路径添加到 $LIB_PATH .

这还能做得更好吗?

好的,我发现出了什么问题(感谢我在 JRuby 论坛上得到的一个不同主题的提示),以及如何轻松解决它:

首先,在生成用于交付我的应用程序的 jar 文件时,我不能包含 JRuby 安装附带的 jruby.jar,但必须使用适当的 JRuby 版本的 jruby-complete.jar,这可以与 JRuby Download page 分开下载 - 在我的例子中,这是 jruby-complete-1.7.23.jar

接下来,我必须包括我的 gem 目录而不是

jar cvfm .... gem

但是

jar cvfm .... -C gem .

(即“-C”,gem-directory,句点)。 Nick Sieger 的文章 gem-in-a-jar.

对此进行了很好的解释

就这些了!