【问题标题】:JRuby+Java: How to find my locally installed Gems in my jarJRuby+Java:如何在我的 jar 中找到我本地安装的 Gems
【发布时间】:2026-01-28 01:15:01
【问题描述】:

(转帖​​说明:这个问题两周前也在JRuby forum发帖,但没有得到答复)

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

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

  • javas(包含 Java 源文件)
  • rubies(包含 Ruby 源文件)
  • 宝石(包含我的宝石)

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

我用

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

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

如果我有一个纯 JRuby 应用程序,它会找到我安装的 gem(我试过这个)。问题是我有一个混合的 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 - 这并不奇怪,因为从 jar 文件运行应用程序时 GEM_HOME 没有任何意义,不是是吗?

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

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

我知道所需的所有 gem 都在我的 jar 文件中,并且位于相对目录“gem”之下。我还知道 Ruby 源代码位于路径下方的某个名为 lib 的目录中(例如 gem/gems/GEMNAME/lib/GEMNAME.rb)。因此,我从顶层目录 (gem) 开始遍历目录树,并将 lib 目录 (gem/gems/GEMNAME/lib) 的所有路径添加到 $LIB_PATH,然后再执行任何require

这可以做得更好吗?

【问题讨论】:

    标签: java rubygems jruby


    【解决方案1】:

    好的,我发现了问题所在(感谢我在 JRuby 论坛上得到的关于另一个主题的提示),以及如何轻松解决它:

    首先,在为我的应用程序生成jar文件时,一定不能包含JRuby安装附带的jruby.jar,而必须使用相应JRuby版本的jruby-complete.jar,可以从@单独下载987654321@ - 就我而言,这是jruby-complete-1.7.23.jar

    接下来,我必须不包含我的 gem 目录

    jar cvfm .... gem
    

    但有

    jar cvfm .... -C gem .
    

    (即“-C”,gem-directory,句点)。 Nick Sieger 的文章gem-in-a-jar 很好地解释了这一点。

    就是这样!

    【讨论】: