2017-12-07 7 views
0

私はJrubyで書かれたいくつかのスクリプトを、それらを.classファイルに変換して難読化したいと思います。しかし、Jrubyを使って.classファイルにアクセスしようとすると、エラーに遭遇しています。Jrubyのインポートクラスファイル

マイファイル構造は次のようになります。

Test2.class

temp/action.rb 
temp/src/Test2.rb 

#temp/src/Test2.rb 

class Test2 
    def self.add(num1,num2) 
     return num1 + num2 
    end 
end 

私が使用して.classファイルするTest2.rbを変換し、次の.classファイルを生成

jrubyc Test2.rb 

今、Test2とそのメソッドにアクセスしようとしています。 NotherのJRubyのファイル、action.rb

#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> 

私は私が間違っているのかわからないんだけどは、任意の助けいただければ幸いです。

+0

'defのself.add'定義Aを聞かない:と、このエラーで、私は誰かが、次のコマンドを使用して、それを試すことforumで見つけます"クラス"(シングルトン)メソッド。 'puts Test2.add(2,3)'と一緒に使うことができます。あるいは、定義で 'self'を削除し、' t = Test2.new;でインスタンスメソッドとして使用できます。 puts t.add(2,3) '。 – BernardK

+0

@BernardK私は両方のメソッドを試しましたが、それぞれ同じエラーが発生しました。 – danynl

答えて

0

私はJRubyを5年間使っておらず、奇妙なことを発見しています。私はコンパイル

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) 

は:ファイルTest2.rb考える

$ 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のを使用して読ま(達人プログラマが、使用できなくなりますから):

If you pass the --java option to jrubyc, it will generate a .java file instead of a .class file. You can then fall back on familiar Java tools to finish the job.

$ 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" + 
... 

私はそうのように "修復" するには、このファイルを編集します:

require 'java' 

#$CLASSPATH << '.' 
java_import 'Test2' 

puts "in #{__FILE__}" 

Test2.xyz 

puts ::Test2.addc(8,9) 

t = ::Test2.new 
puts t.addi(2,3) 

を実行します:次に、ファイルuse_t.rbで、

$ javac -cp .:/Users/b/.rvm/rubies/jruby-9.0.5.0/lib/jruby.jar Test2.java 

を再コンパイルし、

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" + 
... 

$ 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だけで、強制変換パラメータの問題ではない:再び

$ 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 

コンパイル:

NoMethodError: undefined method `xyz' for Java::Default::Test2:Class 

それから私は別のバージョンを試してみてください

$ 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-complete-9.1.15.0.jar)からjruby.orgそれは作品

$ 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 

が、なぜ:(

+0

これは興味深い解決策です。残念ながら、私のファイルが.JARファイルの中にパックされている場合、これを動作させることはできません。それは瓶の外でうまく動作します。 – danynl