尝试在 servlet 上运行维护任务时出现 NoClassDefFoundError

发布于 2024-11-29 08:02:50 字数 2718 浏览 1 评论 0原文

我有一个运行良好的 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技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最后的乘客 2024-12-06 08:02:50

好吧,这真的很愚蠢,但是在 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文