Java JRuby Warbler无法创建可用的可执行JAR文件

Java JRuby Warbler无法创建可用的可执行JAR文件,java,ruby,jruby,bundler,warbler,Java,Ruby,Jruby,Bundler,Warbler,我一直在尝试获得一个本质上非常简单的JRuby脚本,它需要Net::SSH在远程计算机上执行任务并退出。当我发出命令jruby testssh.rb时,程序工作得非常完美,但是,当我使用Warbler将其编译成JAR时,我收到了无法加载Net::SSH的错误 > java -version java version "1.7.0_45" Java(TM) SE Runtime Environment (build 1.7.0_45-b18) Java HotSpot(TM) 64-Bit

我一直在尝试获得一个本质上非常简单的JRuby脚本,它需要Net::SSH在远程计算机上执行任务并退出。当我发出命令jruby testssh.rb时,程序工作得非常完美,但是,当我使用Warbler将其编译成JAR时,我收到了无法加载Net::SSH的错误

> java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

> pik use jruby-1.7.1

> jruby -S warble jar
C:/ruby/jruby-1.7.10/lib/ruby/gems/shared/gems/rawr-1.7.0/lib/zip/zip.rb:28: Use RbConfig instead of obsolete and deprecated Config.
rm -f test-ssh.jar
Creating test-ssh.jar

> java -jar test-ssh.jar
LoadError: no such file to load -- net/ssh
  require at org/jruby/RubyKernel.java:1085
  require at file:/C:/Users/User/AppData/Local/Temp/jruby4935218336857439685extract/jruby-stdlib-complete-1.7.11.jar!/META-INF/jruby.home/lib/ruby/shared/rubygems/core_ext/kernel_require.rb:55
   (root) at test-ssh.rb:7
     load at org/jruby/RubyKernel.java:1101
   (root) at file:/C:/Users/User/Dropbox/programming/ruby/jruby/net-ssh/test-ssh/test-ssh.jar!/META-INF/main.rb:1
  require at org/jruby/RubyKernel.java:1085
   (root) at file:/C:/Users/User/AppData/Local/Temp/jruby4935218336857439685extract/jruby-stdlib-complete-1.7.11.jar!/META-INF/jruby.home/lib/ruby/shared/rubygems/core_ext/kernel_require.rb:1
  require at file:/C:/Users/User/AppData/Local/Temp/jruby4935218336857439685extract/jruby-stdlib-complete-1.7.11.jar!/META-INF/jruby.home/lib/ruby/shared/rubygems/core_ext/kernel_require.rb:55
error: org.jruby.embed.EvalFailedException: (LoadError) no such file to load -- net/ssh
然后,我将文件放入gem,并将
spec.add_runtime\u dependency=“net ssh”
添加到gempec中,并且:

require 'net/ssh'
gem "net-ssh"
进入档案。然后,当我运行jruby-sWarble时,我得到一个不同的错误。我还注意到,Bundler和Ruby不能很好地处理名称中的“-”,因此我不得不重新创建该文件

> jruby -S warble
C:/ruby/jruby-1.7.10/lib/ruby/gems/shared/gems/rawr-1.7.0/lib/zip/zip.rb:28: Use RbConfig instead of obsolete and deprecated Config.
No default executable found in test-ssh.gemspec, using bin/test-ssh.rb
rm -f test-ssh.jar
Creating test-ssh.jar

> java -jar testssh.jar
LoadError: no such file to load -- testssh/bin/testssh.rb
     load at org/jruby/RubyKernel.java:1101
   (root) at file:/C:/Users/User/Dropbox/programming/ruby/jruby/net-ssh/testssh/testssh.jar!/META-INF/main.rb:1
  require at org/jruby/RubyKernel.java:1085
   (root) at file:/C:/Users/User/AppData/Local/Temp/jruby6762643836642223701extract/jruby-stdlib-complete-1.7.11.jar!/META-INF/jruby.home/lib/ruby/shared/rubygems/core_ext/kernel_require.rb:1
  require at file:/C:/Users/User/AppData/Local/Temp/jruby6762643836642223701extract/jruby-stdlib-complete-1.7.11.jar!/META-INF/jruby.home/lib/ruby/shared/rubygems/core_ext/kernel_require.rb:55
error: org.jruby.embed.EvalFailedException: (LoadError) no such file to load -- testssh/bin/testssh.rb
我不知道需要做什么,对于类似的问题,我已经找到了很多半生不熟的答案,或者有人在柳莺github页面上留下了一年多没有答案的bug

代码和错误的要点位于此处:


解决办法是:


bundler创建RubyGems的方式是利用Git,而我没有使用
GitAdd.
来包含所有更改的目录。一旦我添加了
git.
git提交
,莺就找到了它第一次访问时丢失的目录。然后,对于gem依赖项,只需编辑.gempec文件,并将我需要的每个gem的
运行时依赖项
包含到我自己的gem中即可。之后,Warbler包含了这些依赖项,JAR文件可以在没有安装JRuby的情况下运行。

它需要一些文件,以便在运行JAR时可以运行!您可以在gemspec中指定一个,但它将默认为bin/.rb。没有这样的文件存在,因此出现了错误。

我现在看到了。我使用PeaZip打开Jar并查看其内部,在testssh目录中,没有bin文件夹。我看到我必须使用更新jar,但是我只能将它放在主目录中,而不能放在testssh目录下。我需要弄清楚如何在不损坏罐子的情况下做到这一点。有没有办法让warbler包含bin,或者在我的gemspec中指定它?不要修改jar-在您调用warbler的文件夹中,添加bin/testssh.rb。我在创建jar的文件夹中有bin文件夹。但是,它不包括它。我需要在GemPec中添加一些东西才能让warbler包含该目录吗?我现在需要facepalm一点,因为warbler没有选择我的其他目录是因为我没有进行git添加。来包含gem的新更新。我一直忘了Bundler使用git来管理gem中的文件。我已经用我得出的答案编辑/更新了答案。基本上,如果您按照正常情况编写gem,并使用
git add.
,则warbler将自动包含这些文件。