尝试在 servlet 上运行维护任务时出现 NoClassDefFoundError
我有一个运行良好的 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.
Some sanity 检查:
[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
可能相关?
如果我尝试使用正确的 classpath 运行 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
I have a servlet app that is running fine, and not wanting to copy some of the classes to a separate project, developped a command-line maintenance tool within it. However on trying to run this tool, I am getting a 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.
Some sanity checks:
[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[]);
}
I've rechecked the docs for locating files at http://download.oracle.com/javase/6/docs/technotes/tools/findingclasses.html and I can't see anything obvious wrong though I'm sure it's something along those lines. Been stumped on this for a while and seem to have stopped making progress, so any help would be appreciated with finding the cause.
imports
(and the full unappended classpath which I am using. I was just eliminating it down to the smallest relevant to avoid mixing in other problems):
Any other dependencies are in the same package
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
Possibly relevant?
If I try to run javap with the proper claasspath it can't find the class:
[juhani@hadoop01 WEB-INF]$ javap -classpath ./classes/ xyz.logger.FileToHBaseTransfer
ERROR:Could not find xyz.logger.FileToHBaseTransfer
Just verifying the class format, it is indeed 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好吧,这真的很愚蠢,但是在 Eclipse 调试器中运行并煞费苦心地比较巨大的类路径后,事实证明,一直以来的错误是我将类名写为 HBase 而不是 Hbase< /em>
希望这可以作为对其他人的警告,并且我所做的随机诊断可能会帮助其他人解决相关问题
Ok this is really stupid but after running in the eclipse debugger and painstakingly comparing the huge classpath, it turned out that what was wrong the whole time was me writing the classname as HBase rather than Hbase
Hope that serves as a warning to others, and that the random diagnostics I was doing might help someone else solve a related issue