ClassPathの外部ジャーとHBase
質問
ファイルに外部ジャーを使用することに問題があります。私はいつもわかります:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration`
at this line: `Configuration config = HBaseConfiguration.create();
そして、このファイルはclassPathにあります。JARを実行するときにオプションを設定しています。
$ java -jar hbase.jar -classpath "/usr/lib/hbase/*:/usr/lib/hadoop/*"
このファイルは、このコマンドを呼び出した後に正常にコンパイルします。
$ javac -classpath "/usr/lib/hbase/*:/usr/lib/hadoop/*" HBaseScanner.java
何をすべきか?
解決 3
私の問題は、ClassPathを使用していることです -classpath
オプションとjarを実行します -classpath
無視されるオプション。
マニフェストファイルに瓶を追加しましたが、これは機能します。
これも同様の問題です。 Java ClassPathに複数の瓶を設定します
他のヒント
JVMは、クラスローダーがクラスの静的メンバーを初期化できない場合、java.lang.noclassdeffounderrorを投げます。例外がスローされます。または、このクラスの静的初期イザーによってアクセスされる別のクラスが見つからない場合。これは、クラスローダータイヤがHbaseconfiguratonをロードするときに何が起こっているかのように見えます。このクラスのHbaseconfigurationは、キャノンが例外につながる何かを期待しています。
この種の失敗をデバッグするのは難しいです。
編集:不足しているものを把握する最も簡単な方法は、すべてのHBaseソースが接続され、たとえばEclipseを使用し、トレースしてデバッガーでプログラムを起動することです。 HBaseConfiguration.create()
電話。
Javaがこの状況でエラーまたは少なくとも警告を与えてくれた場合、それは本当に便利です。私は1つの解決策があなたの瓶をこのように実行することだと思います
java -cp "myclasspath":myjarfile.jar MyClassname