我有一个运行良好的servlet应用程序,并且不想将某些类复制到单独的项目中,在其中开发了一个命令行维护工具。但是在尝试运行此工具时,我收到NoClassDefFoundError:
[juhani@hadoop01 WEB-INF]$ java -classpath .:/usr/share/tomcat5/webapps/xyz/WEB-INF/classes/ xyz.logger.FileToHBaseTransfer
Exception in thread "main" java.lang.NoClassDefFoundError: xyz/logger/FileToHBaseTransfer
Caused by: java.lang.ClassNotFoundException: xyz.logger.FileToHBaseTransfer
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: xyz.logger.FileToHBaseTransfer. Program will exit.
[juhani@hadoop01 WEB-INF]$ ls -al classes/xyz/logger/FileToHbaseTransfer.class
-rw-r--r-- 1 tomcat tomcat 2815 8月 10 16:02 classes/xyz/logger/FileToHbaseTransfer.class
[juhani@hadoop01 WEB-INF]$ javap -classpath ./classes/xyz/logger/ FileToHbaseTransfer
Compiled from "FileToHbaseTransfer.java"
public class xyz.logger.FileToHbaseTransfer extends java.lang.Object{
public xyz.logger.FileToHbaseTransfer();
public static void main(java.lang.String[]);
}
我已经重新检查了用于在http://download.oracle.com/javase/6/docs/technotes/tools/findingclasses.html找到文件的文档,虽然我确信这些内容是按照这些方式进行的,但我看不出任何明显的错误。被遗忘了一段时间,似乎已停止取得进展,所以任何帮助都会因为找到原因而受到赞赏。
(以及我正在使用的完整未卸载的类路径。我只是将其消除到最小的相关性以避免混合其他问题): 任何其他依赖项都在同一个包中
package xyz.logger;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTablePool;
java -classpath .:/usr/share/tomcat5/webapps/xyz/WEB-INF/classes/:/usr/lib/hbase/:/usr/lib/hadoop/:/etc/hbase/conf/:/etc/hadoop/conf/ xyz.logger.FileToHBaseTransfer
如果我尝试使用正确的claasspath运行javap,则无法找到该类:
[juhani@hadoop01 WEB-INF]$ javap -classpath ./classes/ xyz.logger.FileToHBaseTransfer
ERROR:Could not find xyz.logger.FileToHBaseTransfer
只是验证类格式,确实是1.6(http://en.wikipedia.org/wiki/Class_(file_format)):
[juhani@hadoop01 ~]$ hexdump /usr/share/tomcat5/webapps/xyz/WEB-INF/classes/xyz/logger/FileToHbaseTransfer.class
0000000 feca beba 0000 3200 8700 0007 0102 2600
答案 0 :(得分:1)
好吧这真的很愚蠢但是在eclipse调试器中运行并且苦心地比较了巨大的类路径之后,事实证明,整个时间的错误是我将类名称为 HBase 而不是 HBASE
希望这可以作为对他人的警告,并且我正在做的随机诊断可以帮助其他人解决相关问题