Jruby Gems-in-a-jar问题

Jruby Gems-in-a-jar问题,ruby,rubygems,jruby,gems-in-a-jar,Ruby,Rubygems,Jruby,Gems In A Jar,我试图用ruby(使用jruby)编写一些代码,用jrubyc编译成java字节码,并部署到一台远程机器上,在那里它将在JVM上运行(那里没有可用的ruby) 只要我乐意使用标准的jruby库,一切都很好。正如jruby网站上所解释的,我只需将jruby-complete.jar库复制到远程机器,并在运行时将其包含在类路径中。我启动了我编译的脚本,它工作了:酷 当我需要一些其他库(通常是rubygems)来运行我的脚本时,问题就开始了。 我知道像rawr这样的很酷的东西,我成功地测试了它,它可以

我试图用ruby(使用jruby)编写一些代码,用jrubyc编译成java字节码,并部署到一台远程机器上,在那里它将在JVM上运行(那里没有可用的ruby)

只要我乐意使用标准的jruby库,一切都很好。正如jruby网站上所解释的,我只需将jruby-complete.jar库复制到远程机器,并在运行时将其包含在类路径中。我启动了我编译的脚本,它工作了:酷

当我需要一些其他库(通常是rubygems)来运行我的脚本时,问题就开始了。
我知道像rawr这样的很酷的东西,我成功地测试了它,它可以把你所需要的全部放在一个包中。 然而,这并不是我想要的解决方案:我将有许多小脚本独立运行,我不希望它们中的每一个都增长到至少10MB,因为我疯狂地将jruby-complete.jar包含在每一个脚本中

我想要的是为我需要使用的每个库编译一个.jar,将它们放在远程机器上的一个公共文件夹中,并在运行时在JVM上运行我编译的jruby脚本时将它们包含在类路径中。
也就是说,我尝试按照这里的说明进行操作:
我用“慢性”宝石尝试了上面显示的例子。循序渐进:

  • 本地安装gem: java-jarjruby-complete-1.1.6.jar-sgem-install-i./chronic-no-rdoc-no-ri
  • 将其打包到罐子中: jar cf chronic.jar-C chronic
  • 编写一个两行测试脚本,将其保存为testt.rb:

    需要“慢性”
    Chronic.parse('明天')

  • 使用jrubyc testt.rb编译

  • 使用以下命令运行生成的java类testt.class(jruby-complete.jar和chronic.jar与java类位于同一文件夹中): java-cp.:/jruby complete.jar:./chronic.jar testt
  • 我得到以下错误:

    线程“main”文件中出现异常:/Users/ave2/NetBeansProjects/jrubywatir/lib/jruby-complete.jar/METAINF/jruby.home/lib/ruby/site\u ruby/shared/builtin/core\u ext/symbol.rb:1:in'const\u missing':未初始化的常量慢性(NameError)
    来自testt.rb:2
    …内部jruby堆栈已删除…
    从模块.const_缺失(testt.rb:2)
    from(未知)。(未知)(:1)


    我真的不明白我做错了什么,我完全被困在这个问题上了。我是Ruby中的noob,更习惯于Python:不要错过一个转化异教徒的机会!:-)谢谢

    将其放在测试脚本的顶部:


    需要“rubygems”

    据我所知,看起来你没有做错任何事情,而且可能遇到了错误。您能用一个更新的版本()来尝试您的示例吗?如果您仍然看到这个问题,请在上创建一个bug?谢谢。

    Rob,谢谢你的回答。我添加了这一行并再次编译,但仍然得到了一个错误,尽管略有不同(说明了一个定制需求):java-cp.:./jruby complete.jar:./chronic.jar testt异常位于线程“main”文件中:/Users/ave2/NetBeansProjects/jrubywatir/lib/jruby-complete.jar/META-INF/jruby.home/lib/ruby/site\u ruby/1.8/rubygems/custom\u require.rb:31:in'const\u missing':testt.rb:3中的未初始化常量慢性(NameError)…内部jruby堆栈已删除。。。从Module.const_missing(testt.rb:3)到(unknown)。(unknown)(:1)嗨,我刚刚找到了解决方案,这对于至少有一些ruby技能的人来说可能是显而易见的。然而,对于像我这样的noobs来说,这仍然值得一提。这里是:当您创建jar文件时,它不能与您要加载的gem具有相同的基名称。在我的例子中,我有一个名为“chronic.jar”的jar文件,但它不起作用。我只是将它重命名为“chroniclib.jar”,在我的脚本中添加了require'rubygems',编译它并使用以下命令运行:java-cp.。./jruby-complete-1.4.0.jar.:.chroniclib.jar testt it works!不需要在脚本中使用.jar!Jruby岩石!:-)顺便说一句,尼克,谢谢你在罐子里的宝石上发表的精彩文章,没有它,这一切都不可能实现!最后一件事:只有当.jar和脚本在同一个文件夹中时,我才会遇到这个问题。如果我将jar放入子文件夹并相应地调整java类路径,即使jar与gemI同名,它也会工作,我遇到了类似的问题。当我试图通过修改命令行上的类路径来运行脚本时,(使用-rjar_file_name.jar),我得到了一个LoadError:没有这样的文件要加载--jar_file_name.jar。文件在那里,但看不见。