Проблемы с вызовом Java-класса из JRuby - PullRequest
5 голосов
/ 22 марта 2011

Я пытаюсь использовать котельную трубу от JRuby. Я видел руководство по вызову Java из JRuby и успешно использовал его с другим пакетом Java, но не могу понять, почему то же самое не работает с шаблоном.

Я пытаюсь в основном сделать эквивалент этой Java из JRuby:

URL url = new URL("http://www.example.com/some-location/index.html");
String text = ArticleExtractor.INSTANCE.getText(url);

Попробовал это в JRuby:

require 'java'
url = java.net.URL.new("http://www.example.com/some-location/index.html")
text = Java::DeL3sBoilerpipeExtractors::ArticleExtractor.INSTANCE.getText(url)

Это основано на API Javadocs для котельной трубы. Вот ошибка:

jruby-1.6.0 :042 > Java::DeL3sBoilerpipeExtractors::ArticleExtractor
NameError: cannot load Java class deL3sBoilerpipeExtractors.ArticleExtractor
        from org/jruby/javasupport/JavaClass.java:1195:in `for_name'
        from org/jruby/javasupport/JavaUtilities.java:34:in `get_proxy_class'
        from /usr/local/rvm/rubies/jruby-1.6.0/lib/ruby/site_ruby/shared/builtin/javasupport/java.rb:45:in `const_missing'
        from (irb):42:in `evaluate'
        from org/jruby/RubyKernel.java:1087:in `eval'
        from /usr/local/rvm/rubies/jruby-1.6.0/lib/ruby/1.8/irb.rb:158:in `eval_input'
        from /usr/local/rvm/rubies/jruby-1.6.0/lib/ruby/1.8/irb.rb:271:in `signal_status'
        from /usr/local/rvm/rubies/jruby-1.6.0/lib/ruby/1.8/irb.rb:270:in `signal_status'
        from /usr/local/rvm/rubies/jruby-1.6.0/lib/ruby/1.8/irb.rb:155:in `eval_input'
        from org/jruby/RubyKernel.java:1417:in `loop'
        from org/jruby/RubyKernel.java:1190:in `catch'
        from /usr/local/rvm/rubies/jruby-1.6.0/lib/ruby/1.8/irb.rb:154:in `eval_input'
        from /usr/local/rvm/rubies/jruby-1.6.0/lib/ruby/1.8/irb.rb:71:in `start'
        from org/jruby/RubyKernel.java:1190:in `catch'
        from /usr/local/rvm/rubies/jruby-1.6.0/lib/ruby/1.8/irb.rb:70:in `start'
        from /usr/local/rvm/rubies/jruby-1.6.0/bin/irb:17:in `(root)'

Похоже, что он не анализировал верблюд в соответствующее имя пакета Java. Что я делаю неправильно? Я полагаю, что я настроил свой classpath хорошо (последние 3 записи), хотя может быть некоторый конфликт с xerces, возможно, включенным дважды:

$ echo $CLASSPATH
:/jellly/Maui1.2:/jellly/Maui1.2/src:/jellly/Maui1.2/bin:/jellly/Maui1.2/lib/commons-io-1.4.jar:/jellly/Maui1.2/lib/commons-logging.jar:/jellly/Maui1.2/lib/icu4j_3_4.jar:/jellly/Maui1.2/lib/iri.jar:/jellly/Maui1.2/lib/jena.jar:/jellly/Maui1.2/lib/maxent-2.4.0.jar:/jellly/Maui1.2/lib/mysql-connector-java-3.1.13-bin.jar:/jellly/Maui1.2/lib/opennlp-tools-1.3.0.jar:/jellly/Maui1.2/lib/snowball.jar:/jellly/Maui1.2/lib/trove.jar:/jellly/Maui1.2/lib/weka.jar:/jellly/Maui1.2/lib/wikipediaminer1.1.jar:/jellly/Maui1.2/lib/xercesImpl.jar:/jellly/boilerpipe-1.1.0/boilerpipe-1.1.0.jar:/jellly/boilerpipe-1.1.0/lib/nekohtml-1.9.13.jar:/jellly/boilerpipe-1.1.0/lib/xerces-2.9.1.jar

Ответы [ 2 ]

9 голосов
/ 22 марта 2011

Я бы рекомендовал не пытаться угадать имя модуля, которое мы поместили под Java ::, поскольку для необычных пакетов он может быть испорчен довольно плохо. Используйте java_import 'your.weird.package.ArticleExtractor' или, если все компоненты пакета совместимы с именованием методов Ruby, вы также можете сделать Java :: your.weird.package.ArticleExtractor.

Кроме того, поскольку вы можете столкнуться с этим ... вы захотите ссылаться на переменную INSTANCE как ArticleExtractor :: INSTANCE, поскольку мы отображаем ее как константу Ruby.

Веселись!

0 голосов
/ 08 сентября 2017

Вы также можете использовать красивый Jruby Boilerpipe Gem , который обертывает Java-код

Или чистую рубиновую реализацию Boilerpipe Ruby Boilerpipe Gem

require 'boilerpipe'  

Boilerpipe::Extractors::ArticleExtractor.text("https://github.com/jruby/jruby/wiki/AboutJRuby")
...