[英]import class file in Jruby
我有一些用Jruby編寫的腳本,希望通過將它們轉換為.class文件來進行混淆。 但是,當我嘗試使用Jruby訪問.class文件時,我遇到了錯誤。
我的文件結構如下所示:
temp/action.rb
temp/src/Test2.rb
#temp/src/Test2.rb
class Test2
def self.add(num1,num2)
return num1 + num2
end
end
我使用將Test2.rb轉換為.class文件
jrubyc Test2.rb
產生以下.class文件:
Test2.class
現在,我嘗試從另一個jruby文件action.rb
訪問Test2及其方法。
#temp/action.rb
require 'java'
$CLASSPATH << "src"
java_import 'Test2'
t = Test2.new
puts t.add(2,3)
但是我收到以下錯誤:
NoMethodError: undefined method 'add' for <Java::Default::Test2:0x369f73a2>
我不確定自己在做什么錯,任何幫助將不勝感激。
我已經五年沒有使用JRuby了,發現了很多奇怪的東西。 給定文件Test2.rb
:
class Test2
def self.addc(num1, num2)
num1 + num2
end
def self.xyz
puts 'xyz'
end
def addi(num1, num2)
num1 + num2
end
end
puts Test2.addc(4,6)
t = Test2.new
puts t.addi(2, 3)
我編譯:
$ jrubyc Test2.rb
$ jruby -J-cp .:/Users/b/.rvm/rubies/jruby-9.0.5.0/lib/jruby.jar use_t.rb
in use_t.rb
NoMethodError: undefined method `addc' for Java::Default::Test2:Class
然后,我讀了《使用Jruby》(來自實用程序員,但不再可用):
如果將--java選項傳遞給jrubyc,它將生成一個.java文件而不是.class文件。 然后,您可以依靠熟悉的Java工具來完成工作。
$ jrubyc --java Test2.rb
$ javac -cp .:/Users/b/.rvm/rubies/jruby-9.0.5.0/lib/jruby.jar Test2.java
Test2.java:16: error: unclosed string literal
String source = new StringBuilder("class Test2
^
Test2.java:17: error: illegal character: '\'
\n" +
^
我打開Test2.java
並看到:
public class Test2 extends RubyObject {
private static final Ruby __ruby__ = Ruby.getGlobalRuntime();
private static final RubyClass __metaclass__;
static {
String source = new StringBuilder("class Test2
\n" +
" def self.addc(num1, num2)
\n" +
" num1 + num2
\n" +
" end
\n" +
...
我編輯此文件以“修復”它,如下所示:
static {
String source = new StringBuilder("class Test2\n" +
" def self.addc(num1, num2)\n" +
" num1 + num2\n" +
" end\n" +
" \n" +
" def self.xyz\n" +
" puts 'xyz'\n" +
" end\n" +
"\n" +
...
然后重新編譯
$ javac -cp .:/Users/b/.rvm/rubies/jruby-9.0.5.0/lib/jruby.jar Test2.java
並且,與文件use_t.rb
:
require 'java'
#$CLASSPATH << '.'
java_import 'Test2'
puts "in #{__FILE__}"
Test2.xyz
puts ::Test2.addc(8,9)
t = ::Test2.new
puts t.addi(2,3)
執行 :
$ jruby -J-cp .:/Users/b/.rvm/rubies/jruby-9.0.5.0/lib/jruby.jar use_t.rb
10
5
uri:classloader:/jruby/java/core_ext/object.rb:93: warning: already initialized constant Test2
in use_t.rb
xyz
17
5
有用 ! 奇怪的彎路。
這不是強制參數的問題,因為僅xyz
:
NoMethodError: undefined method `xyz' for Java::Default::Test2:Class
然后我嘗試另一個版本:
$ rvm install jruby
...
jruby-9.1.7.0 - #configure
jruby-9.1.7.0 - #download
...
jruby-9.1.7.0 - #generating default wrappers........
$ rvm use jruby
Using /Users/b/.rvm/gems/jruby-9.1.7.0
再次編譯:
$ jrubyc Test2.rb
TypeError: failed to coerce org.objectweb.asm.ClassWriter to org.jruby.org.objectweb.asm.ClassVisitor
block in compile_files_with_options at /Users/b/.rvm/rubies/jruby-9.1.7.0/lib/ruby/stdlib/jruby/compiler.rb:189
然后,我從jruby.org下載了最新版本( jruby-complete-9.1.15.0.jar
),由於出現此錯誤,我在一個論壇中發現有人使用以下命令並進行嘗試:
$ java -cp .:/userdata/Sources/jruby-complete-9.1.15.0.jar org.jruby.Main ./use_t.rb
10
5
uri:classloader:/jruby/java/core_ext/object.rb:95: warning: already initialized constant Test2
in ./use_t.rb
xyz
17
5
它有效,但不要問為什么:(
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.