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

时间:2016-01-02 10:09:59

标签: java rubygems jruby

(Crossposting note:这个问题也在两周前发布在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应用程序,它会找到我安装的宝石(我试过这个)。问题是我有一个混合的Java + JRuby应用程序,它应该从一个jar文件运行。我正在创建我的jar文件:

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

正如我所看到的,很好地将我的宝石打包到jar文件中。我跑的时候 我的申请

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

当我需要一个已安装的gem时,我得到一个异常,说没有找到Gem - 这并不奇怪,因为GEM_HOME在从jar文件运行应用程序时没有任何意义,不是它?

我需要一种不同的方式告诉我的应用程序,Gems在哪里找到。在这种情况下,最好的方法是什么?我应该明确地操纵$ LOAD_PATH,如果是,怎么做?或者我可以以某种方式设置GEM_HOME,以便它指向jar内的Gem目录吗?

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

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

这可以做得更好吗?

1 个答案:

答案 0 :(得分:0)

好的,我发现了什么问题(感谢我在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很好地解释了这一点。

这就是全部!