【问题标题】:JRuby Warbler not creating usable executable JAR filesJRuby Warbler 没有创建可用的可执行 JAR 文件
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 我现在明白了。我使用 PeaZip 打开 Jar 并查看其中,在 testssh 目录中,没有 bin 文件夹。我看到我必须使用jar utility 来更新jar,但我只能将它放在主目录中,而不是在testssh 目录下。我需要弄清楚如何在不破坏 JAR 的情况下做到这一点。有没有办法让莺包含垃圾箱,或者在我的 gemspec 中指定它?
    • 不要修改 jar - 在你调用 warbler 的文件夹中,添加 bin/testssh.rb。
    • 我在创建 jar 的文件夹中有 bin 文件夹。但是,它不包括它。我是否必须在 gemspec 中添加一些东西才能使莺包含该目录?
    • 我现在不得不面对一下,因为 Warbler 没有选择我的其他目录的原因是因为我没有通过 git add . 来包含 gem 的新更新。我一直忘记 Bundler 使用 git 来管理 gem 中的文件。
    • 我已经根据我的发现编辑/更新了答案。基本上,如果您按照正常方式编写 gem,并使用git add .,warbler 将自动包含这些文件。
    猜你喜欢
    • 2020-05-20
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2012-05-14
    • 2018-08-16
    • 2022-01-08
    相关资源
    最近更新 更多