尝试在servlet上运行维护任务时获取NoClassDefFoundError

时间:2011-08-15 03:51:00

标签: java classpath

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

1 个答案:

答案 0 :(得分:1)

好吧这真的很愚蠢但是在eclipse调试器中运行并且苦心地比较了巨大的类路径之后,事实证明,整个时间的错误是我将类名称为 HBase 而不是 HBASE

希望这可以作为对他人的警告,并且我正在做的随机诊断可以帮助其他人解决相关问题