thinkBig
thinkBig

Reputation: 873

NoClassDefFoundError: wrong name

I wrote a java program to test RESTful web services by using Netbeans7.0.1 and it works fine there. Now I wrote the build.xml file to compile the code and when I try to run the generated .class file I always got this exception:

Exception in thread "main" java.lang.NoClassDefFoundError: ClientREST (wrong name: clientrest/ClientREST)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    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: ClientREST. Program will exit.

The name and path are correct, so any thoughts why I'm getting this exception?

Upvotes: 75

Views: 141669

Answers (8)

Andrew B
Andrew B

Reputation: 23

I also have encountered this error on Windows when using Class.forName() where the class name I use is correct except for case.

My guess is that Java is able to find the file at the path (because Windows paths are case-insensitive) but the parsed class's name does not match the name given to Class.forName().

Fixing the case in the class name argument fixed the error.

Upvotes: 0

Sankara Sarma
Sankara Sarma

Reputation: 1

Here is my class structure

package org.handson.basics;

public class WithoutMain {

    public static void main() {
        System.out.println("With main()...");
    }
}

To compile this program, I had to use absolute path. So from src/main/java I ran:

javac org/handson/basics/WithoutMain.java

Initially I tried with the below command from basics folder and it didn't work

basics % java WithoutMain 
Error: Could not find or load main class WithoutMain
Caused by: java.lang.NoClassDefFoundError: org/handson/basics/WithoutMain (wrong name: WithoutMain)

Later I went back to src\main\java folder and ran the class with relevant package structure, which worked as expected.

java % java org.handson.basics.WithoutMain      
With main()...

Upvotes: 0

Vivek Singh
Vivek Singh

Reputation: 1025

Suppose you have class A and a class B

    public class A{
      public static void main(String[] args){
      ....
      .....
     //creating classB object
     new classB();
    
    }
   }
    class B{
    
    }

this issue can be resolved by moving class B inside of class A and using static keyword

public class A{
  public static void main(String[] args){
  ....
  .....
 
  //creating class B
new classB();

static class B{

}   
}

Upvotes: 0

ShivaMahesh
ShivaMahesh

Reputation: 41

Try the below syntax:

Suppose java File resides here: fm/src/com/gsd/FileName.java

So you can run using the below syntax:

(Make current directory to 'fm')

java src.com.gsd.FileName

Upvotes: 4

Slaphead
Slaphead

Reputation: 91

To further note on Garry's reply: The class path is the base directory where the class itself resides. So if the class file is here -

/home/person/javastuff/classes/package1/subpackage/javaThing.class

You would need to reference the class path as follows:

/home/person/javastuff/classes

So to run from the command line, the full command would be -

java -cp /home/person/javastuff/classes package1/subpackage/javaThing

i.e. the template for the above is

java_executable -cp classpath the_class_itself_within_the_class_path

That's how I finally got mine to work without having the class path in the environment

Upvotes: 6

Gaʀʀʏ
Gaʀʀʏ

Reputation: 4540

I encountered this error using command line java:

java -cp stuff/src/mypackage Test

where Test.java resides in the package mypackage.

Instead, you need to set the classpath -cp to the base folder, in this case, src, then prepend the package to the file name.

So it will end up looking like this:

java -cp stuff/src mypackage.Test

Upvotes: 19

BalusC
BalusC

Reputation: 1108567

Exception in thread "main" java.lang.NoClassDefFoundError: ClientREST

So, you ran it as java ClientREST. It's expecting a ClientREST.class without any package.


(wrong name: clientrest/ClientREST)

Hey, the class is trying to tell you that it has a package clientrest;. You need to run it from the package root on. Go one folder up so that you're in the folder which in turn contains the clientrest folder representing the package and then execute java clientrest.ClientREST.

You should not go inside the clientrest package folder and execute java ClientREST.

Upvotes: 144

Swapnil
Swapnil

Reputation: 897

Probably the location you are generating your classes in doesnt exists on the class path. While running use the jvm arg -verbose while running and check the log whether the class is being loaded or not.

The output will also give you clue as to where the clasess are being loaded from, make sure that your class files are present in that location.

Upvotes: 3

Related Questions