我有一个运行良好的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

最佳答案

好的,这确实很愚蠢,但是在eclipse调试器中运行并仔细比较了巨大的类路径之后,事实证明,一直以来,我将类名写为HBase而不是Hbase一直是错误的

希望这对其他人是一个警告,并且我所做的随机诊断可能会帮助其他人解决相关问题

09-16 05:05
查看更多