Re: NoClassDefFoundError can't run class files
On 06/11/2010 10:06 PM, patrol wrote:
Hi,
I've installed the JDK. I created simple beginner programs of the
"Hello World" variety. I can compile successfully, but not run. I get
the following error:
java.lang.NoClassDefFoundError: c:/Users/John/Documents/AbsoluteJava/
C1/TotalCalsBurned
Caused by: java.lang.ClassNotFoundException:
c:.Users.John.Documents.AbsoluteJava.C1.TotalCalsBurned
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: c:/Users/John/Documents/AbsoluteJava/C1/
TotalCalsBurned. Program will exit.
Exception in thread "main"
I'm not using any fancy packages in my programs, so I don't know what
class it can't find. I've scoured Google without luck. Can anyone
offer a solution?
What makes a package "fancy"?
Either the class has a 'package' statement or it doesn't. It really should,
but at this stage we won't worry about that too much.
If the class doesn't have a 'package', then the compile classpath has to
include the very directory in which the source resides. Packages translate to
directories that are relative to a classpath entry.
The easiest way to establish a compile classpath is to "cd" to the directory
that is the root of the classpath, or the one where the no-package Java source is.
So if the package for class 'TotalCalsBurned' is 'C1' (package names really
should be lower case), then "C1" should be a subdirectory of the classpath
root, i.e., the current directory. "TotalCalsBurned.java" will be in that
subdirectory, so its relative path is "C1/TotalCalsBurned.java".
If the package is 'Users.John.Documents.AbsoluteJava.C1', then "cd" to the
parent directory of "Users/". (Package names really should be lower case.)
If there is no package, then "cd" to the directory wherein resides
"TotalCalsBurned.java".
The argument to "javac" is the directory equivalent of the package name, thus,
respectively,
javac C1/TotalCalsBurned.java
javac Users/John/Documents/AbsoluteJava/C1/TotalCalsBurned.java
javac TotalCalsBurned.java
(Package names really should be lower case.)
<http://java.sun.com/javase/6/docs/technotes/guides/javac/index.html>
<http://java.sun.com/javase/6/docs/technotes/tools/solaris/javac.html>
<http://java.sun.com/javase/6/docs/technotes/tools/windows/javac.html>
--
Lew