外部罐子和类路径中的HBase

时间:2010-08-17 12:24:23

标签: java jar classpath hbase

我在我的文件中使用外部jar时遇到问题。我总是得到:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfiguration`  
at this line: `Configuration config = HBaseConfiguration.create();

这个文件在类路径上,我在运行jar时设置选项:

$ java -jar hbase.jar -classpath "/usr/lib/hbase/*:/usr/lib/hadoop/*"

调用此命令后,此文件成功编译:

$ javac -classpath "/usr/lib/hbase/*:/usr/lib/hadoop/*" HBaseScanner.java

怎么办?

3 个答案:

答案 0 :(得分:2)

如果类加载器无法初始化类的静态成员,则JVM将抛出java.lang.NoClassDefFoundError,例如抛出异常。或者,如果它找不到此类中的静态初始化程序访问的另一个类。这看起来就像正在发生的事情,当类加载器厌倦了加载HBaseConfiguraton时,这个类HBaseConfiguration期望它能够获得导致异常的东西,这就是丢失了。
运气好,调试这种失败。

编辑: 找出缺失的最简单的方法是在调试器中启动程序,连接所有HBase源,比如在Eclipse下,并跟踪HBaseConfiguration.create()调用。

答案 1 :(得分:0)

我的问题是我使用-classpath选项并运行jar来设置classpath,这会导致-classpath选项被忽略。

我在清单文件中添加了jar,这可行。

这是类似的问题:Setting multiple jars in java classpath

答案 2 :(得分:0)

如果java在这种情况下给我们一个错误或者至少有一个警告,那将非常方便。我相信一个解决方案是像这样执行你的jar

java -cp "myclasspath":myjarfile.jar MyClassname