(Crossposting note:这个问题也在两周前发布在JRuby forum,但尚未得到答复)
我在Windows上使用JRuby 1.7.23(但我认为这无关紧要 这个问题)。
我的项目目录包含以下子目录:
也就是说,我使用的是本地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。
这可以做得更好吗?
答案 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很好地解释了这一点。
这就是全部!