External jars & HBase in classpath
I'm having problem with using external jars in my file. I always get:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfigu开发者_如何学编程ration`
at this line: `Configuration config = HBaseConfiguration.create();
And this file is on the classpath, I'm setting options when running jar:
$ java -jar hbase.jar -classpath "/usr/lib/hbase/*:/usr/lib/hadoop/*"
This file compiles successfully after invoking this command:
$ javac -classpath "/usr/lib/hbase/*:/usr/lib/hadoop/*" HBaseScanner.java
What to do?
JVM will throw java.lang.NoClassDefFoundError if the class loader cannot initialize static members of a class, say an exception is thrown. Or if it cannot find another class that is accessed by a static initializer in this class. This looks like what is happening, when class loader tires to load HBaseConfiguraton, this class HBaseConfiguration is expecting something that it cannon get that leads to an exception, that is lost.
Tough luck debugging this sort of failures.
EDIT:
The easiest way to figure out what is missing is to launch the program in a debugger with all HBase sources connected, say under Eclipse, and trace the HBaseConfiguration.create()
call.
It would be really handy if java gave us an error or at least a warning in this situation. I believe one solution is to execute your jar like this
java -cp "myclasspath":myjarfile.jar MyClassname
My problem was that I was setting classpath using -classpath
option and running jar, which causes the -classpath
option to be ignored.
I have added jars in manifest file and this works.
This is similar problem: Setting multiple jars in java classpath
精彩评论