Troubleshoot NoClassDefFoundError in Java

感情迁移 提交于 2019-11-27 15:42:05

This is due to your classpath, which will default to the current directory. When you run java Main from /home/user/program it finds the class in the current directory (since the package seems to be unset, meaning it is the default). Hence, it finds the class in /home/user/program/Main.class.

Running java /home/user/program/Main from /home tries to find the class in the classpath (the current directory) which will look in /home/home/user/program expecting to find the file Main.class containing a definition of the Main class with package .home.user.program.

Extra detail: I think the java launcher is trying to be nice by converting /-notation for a classname to the .-notation; and when you run java /home/user/program/Main it is actually running java .home.user.program.Main for you. This is because you shouldn't be specifying a file, but a fully specified classname (ie including package specifier). And when a class has a package java expects to find that class within a directory structure that matches the package name, inside a directory (or jar) in the classpath; hence, it will try to look in /home/home/user/program for the class file

You can fix it by specifying your classpath with -cp or -classpath:

java -cp /home/user/program Main
Michael Laffargue

Because its looking for the class using the fullname you give (/home/user/program/Main). You should only look for the Main class but using the good classpath : java Main -cp /home/user/program

Which means it'll search the Main class in the given set of paths

Your 2nd command version does not know where to find the classes. You need to provide the so called classpath

/home$ java -cp userprogram Main

Because of what you say I conclude this:

  • Main is in "top" (root) package

And when you execute java you must indicate the classpath, it is, the root directory where your pakage and classes structure is located.

In your case it is the very /home/user/program. And I guess your classpath is defined as "." (the dir you are located at). When you call java from home the classpath is being taken erroneosly.

If you want to call your main using a different package declare the package at the top of the class:

package user.program;

And set the classpath to /home (or execute java from that dir). Next call java this way:

java user.program.Main

using dots because its a full class name (indicating packages). That is translated to dirs concatenating classpath + package + class. By example:

/home
user.program -> user/program/
Main         -> Main.class

Good luck!

The problem is that if you call java /home/user/program/Main the package Main is in is meant to be home.user.program, which I assume is not true for Main (I assume it's in the default package, i.e. none at all). Is there a package declaration at the top of Main?

I'd suggest to use the classpath suggestions in the other answers.

This works for me:

java -cp /home/user/program Main

just a while ago faced this kind of error of (NoClassDefFoundError). I imported some third party library in my android app using eclipse env. I got this error during a runtime - some class from this third party library couldn't be found and a result of this NoClassDefFoundError was thrown, despite the mentioned library correctly appeared in classpath, so I really didn't know what else can be done to solve this problem. While playing with "Order and Export" tab within "Java Build Path", I put my imported third party library to the top of the list of all libraries in my project and checked its checkbox - this solved the problem

I came across this same error when trying to compile and run it. The book, "Head First Java" explains and addresses this problem appropriately. Here is a screenshot from the book for your reference.

Hope its helpful.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!