2014-04-08 2 views
0

본질적으로 매우 단순한 JRuby 스크립트를 얻으려고 노력했습니다. Net :: SSH를 사용하면 원격 컴퓨터에서 작업을 수행하고 종료 할 수 있습니다. jruby testssh.rb 명령을 실행하면 프로그램이 완벽하게 작동하지만 Warbler를 사용하여 JAR로 컴파일하면 Net :: SSH를로드 할 수 없다는 오류가 발생합니다.JRuby Warbler가 사용 가능한 실행 가능 JAR 파일을 만들지 못했습니다.

> 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 

난 후 보석에 파일을 넣어, 그리고 gemspec에 spec.add_runtime_dependency = "net-ssh"를 추가하고 :

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 

내가해야할 일들에 대한 손실에있어, 나는이 지저귀의 GitHub의에 대한 버그를 떠난과 유사한 질문, 또는 사람들을위한 어설픈 답변을 많이 발견했습니다 답변이없는 1 년 이상 동안 페이지를 방문하십시오.

코드를 가진 요점과 오류가 여기에 있습니다 : https://gist.github.com/predatorian3/10191754


했다 솔루션 :

방법 들러는 루비 보석을 만들고 그것을 힘내을 활용, 나는 git add .를 사용하지 않은 것입니다 변경된 디렉토리를 모두 포함시킵니다. 내가 git add .git commit을 만들었 으면, Warbler는 처음으로 빠진 디렉토리들을 찾아 냈습니다. 그런 다음 보석 의존성을 위해 .gemspec 파일을 편집하는 것처럼 간단했으며 내 보석에 필요한 각 보석에 runtime_dependency을 포함 시켰습니다. 그 후 Warbler에는 이러한 종속성이 포함되어 있으며 JAR 파일은 JRuby가 설치되지 않은 채로 실행할 수 있습니다.

답변

1

병을 실행할 때 실행할 수있는 파일이 필요합니다! gemspec에서 하나를 지정할 수 있지만 기본값은 bin/.rb입니다. 그러한 파일이 존재하지 않으므로 오류가 발생합니다.

+0

이제 알겠습니다. 나는 PeaZip을 사용하여 Jar 파일을 열었고 내부를 살펴 보았습니다. testssh 디렉토리에는 bin 폴더가 없었습니다. 항아리를 업데이트하기 위해 [jar 유틸리티] (http://docs.oracle.com/javase/tutorial/deployment/jar/update.html)를 사용해야한다는 것을 알았지 만, 메인에 배치 할 수만있었습니다 testsh 디렉토리 아래에 있지 않습니다. JAR을 손상시키지 않고이를 수행하는 방법을 알아 내야합니다. warbler가 bin을 포함 시키거나 내 gemspec에 지정하는 방법이 있습니까? – Pred

+0

warbler를 호출하는 폴더에서 jar 파일을 수정하지 마십시오. bin/testssh.rb를 추가하십시오. – user3512829

+0

jar 파일이 생성되는 폴더에 bin 폴더가 있습니다. 그러나 그것을 포함하지 않습니다. 나는 지저귀다가 그 dir을 포함하도록하기 위해 gemspec에 어떤 것을 추가해야합니까? – Pred