我遇到了同樣的問題,發現問題可以通過鍵入以下命令行(即通過讀取/ usr/lib/hbase/bin/hbase )。
因此,根本原因存在不HBase的外殼,但在JRuby和進一步的調查,發現該根源在通過的JRuby 1.6.5使用的JLine存在。
首先,我創建了〜/ .jlinebindings.properties文件,並在其中放入了「Rubout:backward-delete-char」,希望退格鍵可以「刪除光標後面的一個字符」,但它不起作用。更糟的是,.jlinebindings.properties文件的存在清除了其他鍵綁定(例如箭頭鍵的綁定),所以我刪除了.jlinebindings.properties。我嘗試將鍵綁定設置添加到〜/ .jline.rc和〜/ .inputrc,但它們也不起作用。
我檢出了JLine2源代碼進一步調查,發現最新版本的JLine2不支持.jlinebindings.properties文件。但是,支持.jline.rc。因此,我編譯了最新的JLIne2源代碼,將鍵綁定到.jline.rc文件,並將JLine2庫(target/jline-2.10-SNAPSHOT.jar)指定爲類路徑的第一個元素,但它不起作用。使用新建的JLine2庫,JRuby 1.6.5拋出了IncompatibleClassChangeError。這意味着JLine2已經改變了其API並破壞了向後兼容性。
接下來,我檢查了JRuby源代碼並將其編譯如下。
# JRuby compilation requires ant
$ yum install ant
# Without this, compilation fails.
$ yum install ant-apache-regexp
$ git clone https://github.com/jruby/jruby.git
# Check the latest version
$ git tag
$ git checkout 1.7.1
$ mvn install
使用新的JRuby二進制文件,我再次調用命令行。
$ java -cp \
~/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar \
org.jruby.Main /usr/bin/irb
但是,它引發了SyntaxError。
SyntaxError: file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/lc/ja/encoding_aliases.rb:7: syntax error, unexpected kEND
end
^
eval at org/jruby/RubyKernel.java:1066
real_load at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/locale.rb:134
load at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/locale.rb:110
initialize at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/locale.rb:32
init_config at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/init.rb:114
setup at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/init.rb:16
start at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb.rb:53
(root) at /usr/bin/irb:13
一定有什麼東西錯在encoding_aliases.rb(或新的JRuby已經取得了一定的變化打破向後兼容性),但我沒有心思研究它,所以加入LANG = C作爲一種解決方法。
$ LANG=C java -cp \
~/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar \
org.jruby.Main /usr/bin/irb
這成功地調用了irb,我可以確認backspace按預期工作。 maven/jruby-core/pom.xml表示JRuby 1.7.1引用的JLIne版本是2.7。
作爲最後一步,我嘗試讓HBase shell通過執行以下操作使用新的JRuby。
$ cd /usr/lib/hbase/lib
$ mv jruby-complete-1.6.5.jar{,.backup}
$ cp ~/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar .
$ hbase shell
但是,HBase shell沒有啓動。相反,下面的錯誤消息被髮出。
include_class is deprecated. Use java_import.
include_class is deprecated. Use java_import.
include_class is deprecated. Use java_import.
12/12/28 18:03:12 WARN conf.Configuration: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
NoMethodError: undefined method `getTerminal' for Java::Jline::Terminal:Module
refresh_width at /usr/lib/hbase/bin/../bin/../lib/ruby/shell/formatter.rb:34
initialize at /usr/lib/hbase/bin/../bin/../lib/ruby/shell/formatter.rb:47
(root) at /usr/lib/hbase/bin/../bin/hirb.rb:108
這些錯誤信息表明,更換JRuby的完成 - 。*在/ usr/lib目錄/ HBase的/ lib目錄不能解決問題罐子。
所以,我放棄了,並得出結論說沒有簡單的解決方法來解決這個問題。我的最後結論是,我們必須等待HBase專家用新的JRuby更新HBase shell實現。
我從來沒有過這個問題,但我只玩過0.90。你在使用什麼操作系統? – David
嗨大衛,我的操作系統是centos 6.1 – Jack
是的,很奇怪,我懷疑可能缺少插件 – Jack