java - JRuby Warbler 未创建可用的可执行 JAR 文件

标签 java ruby jruby bundler warbler

我一直在尝试获取一个本质上非常简单的 JRuby 脚本,它需要 Net::SSH 在远程计算机上执行任务并退出。当我发出命令 jrubytestssh.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 的 runtime_dependency 包含到我自己的 gem 中。之后,Warbler 包含了这些依赖项,并且 JAR 文件可以在不安装 JRuby 的情况下运行。

最佳答案

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

关于java - JRuby Warbler 未创建可用的可执行 JAR 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22947724/

相关文章:

java - TextInputLayout - 动态设置 float 文本颜色

java - Java Sound可以用来控制系统音量吗?

ruby - Ruby 1.8.7 中的 flat_map

ruby - 运行 Ruby 脚本输出到 Geektool 时 ANSI 转义序列消失

ruby-on-rails - Ruby 中的异常处理 - 如果需要救援,则调用 begin

windows-7 - mingw/git bash shell 中的 jRuby 问题

java - 如何从 .ajax 调用返回两个 JSON 数组?

java - 如何在网页中流式传输视频?

java - Jruby "RuntimeHelpers"类已弃用

ruby - 没有要加载的文件——rufus-scheduler