【发布时间】:2014-05-21 18:43:20
【问题描述】:
我一直在尝试获得一个本质上非常简单的 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_dependency = "net-ssh" 添加到 gemspec 中,然后:
require 'net/ssh'
gem "net-ssh"
进入 Gemfile。然后当我运行jruby -S warble 时,我得到一个不同的错误。我还注意到,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
我不知道需要做什么,我已经找到了很多类似问题的半生不熟的答案,或者有人在 Warbler github 页面上留下了关于此问题的错误超过一年没有答案。
包含代码和错误的要点位于此处:https://gist.github.com/predatorian3/10191754
解决办法是:
bundler 创建 Ruby gem 的方式是它利用 Git,我没有使用 git add . 来包含所有更改的目录。一旦我完成了git add . 和git commit,Warbler 就会找到那些它第一次丢失的目录。然后对于 gem 依赖,它就像编辑 .gemspec 文件一样简单,并为我自己的 gem 中需要的每个 gem 包含 runtime_dependency。之后,Warbler 包含了这些依赖项,JAR 文件可以在没有安装 JRuby 的情况下运行。
【问题讨论】:
标签: java ruby jruby bundler warbler