【发布时间】:2026-01-28 01:15:01
【问题描述】:
(转帖说明:这个问题两周前也在JRuby forum发帖,但没有得到答复)
我在 Windows 上,使用 JRuby 1.7.23(但我认为这对于 这个问题)。
我的项目目录有以下子目录:
- javas(包含 Java 源文件)
- rubies(包含 Ruby 源文件)
- 宝石(包含我的宝石)
也就是说,我使用的是本地 gem 目录,而不是默认位置。
我用
安装我的gemjruby -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。
这可以做得更好吗?
【问题讨论】: