【问题标题】:Is it possible to create Java classes from JRuby and use them in Java?是否可以从 JRuby 创建 Java 类并在 Java 中使用它们?
【发布时间】:2011-04-19 18:46:34
【问题描述】:

我正在尝试从 JRuby 扩展 Lucene 的 Analyzer 并从 java 中使用它。一个简单的分析器如下所示:

class MyAnalyzer < Java::OrgApacheLuceneAnalysis::Analyzer
  def TokenStream (file_name, reader) 
     result = StandardTokenizer.new(Version::LUCENE_CURRENT, reader)
     result = LowerCaseFilter.new(result)
     result = LengthFilter.new(result, 3, 50) 
     result = StopFilter.new(result, StandardAnalyzer.STOP_WORDS_SET)
     result = PorterStemFilter.new(result)
     result
  end 
end

然后我编译它:jrubyc -c /home/camilo/trunk/utils/target/dependency/lucene-core-3.0.2.jar --javac MyAnalyzer.rb 并将其打包为 jar。

现在,当尝试在 java 中使用 MyAnalyzer 时,MyAnalyzerorg.jruby.RubyObject 的后代,而不是 org.apache.lucene.analysis.Analyzer 的后代。

有没有办法让 Java 将 MyAnalyzer 视为 Analyzer 而不是 RubyObject?还是这种方式超出了 JRuby 现在可以做的范围?

JRuby 版本:jruby 1.6.0 (ruby 1.8.7 patchlevel 330)

【问题讨论】:

    标签: java ruby lucene jruby


    【解决方案1】:

    根据我从您那里了解到的情况,我猜您正在尝试创建一个扩展 Java 类(带有脚本引擎)的 JRuby 类,并将该类交还给 Java。

    您的 Ruby 类可能如下所示:

    require 'java'
    require 'lucene-core.jar'
    
    java_import 'org.apache.lucene.analysis.Analyzer'
    java_import 'org.apache.lucene.analysis.standard.StandardTokenizer'
    java_import 'org.apache.lucene.util.Version'
    java_import 'org.apache.lucene.analysis.TokenStream'
    java_import 'java.io.Reader'
    
    class MyAnalyzer < Analyzer
    
      def tokenStream(file_name, reader) 
         result = StandardTokenizer.new(Version::LUCENE_CURRENT, reader)
          # ...
      end 
    end
    

    然后你可以在 Java 中使用这个类,如下所示:

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    import java.io.FileReader;
    import java.io.FileNotFoundException;
    import java.io.Reader;
    import org.apache.lucene.analysis.Analyzer;
    
    public class RunMyAnalyzer {
    
        public static void main(String[] args) throws ScriptException, FileNotFoundException {
            String filename = "my-analyzer.rb";
    
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("jruby");
            Reader reader = new FileReader(filename);
            engine.eval(reader);
    
            // Instantiate the JRuby class, and cast the result of eval.
            Analyzer analyzer = (Analyzer) engine.eval("MyAnalyzer.new");
    
            // You can then use this analyzer like a Lucene Analyzer
        }
    }
    

    然后编译并运行:

    $ javac -cp .:lucene-core.jar:$JRUBY_HOME/lib/jruby.jar RunMyAnalyzer.java 
    $ java -cp .:lucene-core.jar:$JRUBY_HOME/lib/jruby.jar RunMyAnalyzer
    

    这里的关键是 JRuby 生成一个代理类,然后可以将其转换为 Java 超类 Analyzer

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多