2017-12-07 22 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 및 해당 메소드에 액세스하려고합니다. 사람 같아 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

'데프 self.add' 정의하는 요구하지 않습니다 및이 오류와 함께, 나는 누군가가 다음 명령을 사용하고 시도하는 forum에서 발견 "클래스"(싱글 톤) 메소드. 'puts Test2.add (2,3)'와 함께 사용할 수 있습니다. 또는 정의에서'self '를 제거하고 그것을't = Test2.new;의 인스턴스 메소드로 사용할 수 있습니다. 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