Java Program
File Location : ..new1packageEGB.java
package packageEG ; public class B { public void display() { System.out.println("B") ; } }
File Location : ..new1C.java
package new1 ; import packageEG.B ; public class C { public void display() { B b = new B() ; b.display() ; } }
File Location : ..A.java
import new1.C ; public class A { public static void main(String[] args) { C c = new C() ; c.display() ; } }
Folder View
../ A.java new1/ C.java packageEG/ B.java
It has nested package, one package inside another package.
When I compile main class i.e, “A” it compiles successfully but when I run this program it shows following error :
Exception in thread "main" java.lang.NoClassDefFoundError: packageEG/B at new1.C.display(C.java:7) at A.main(A.java:7) Caused by: java.lang.ClassNotFoundException: packageEG.B at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 2 more
Please help me how to fix this error.
Advertisement
Answer
A simple solution to your problem will be to restructure your directories. It is a good practice to store source files and classes in separate directories, typically “src” and “classes”. Then compile using --class-path
option.
For your case as an example we can consider the structure of your project as (we may also put A.java
in src
directory but to maintain some similarity with your code structure let us consider this):
tree . ├── A.java └── src └── com └── xyz ├── B.java └── C.java
To compile the source using JDK, we need to use the -d
option to specify the base directory of the compiled classes, i.e. classes
, as follows:
javac -d classes src/com/xyz/B.java src/com/xyz/C.java
Now compile A.java
using -cp
or --class-path
option to specify the base directory of the package com.xyz
in order to locate com.xyz.C
.
javac -cp ./classes/ A.java
Now the directory structure will be like:
tree . ├── A.class ├── A.java ├── classes │ └── com │ └── xyz │ ├── B.class │ └── C.class └── src └── com └── xyz ├── B.java └── C.java
To run, explicitly set CLASSPATH
variable to include current directory (denoted using ‘.’) in the CLASSPATH
together with base directory of the package com.xyz
separated by ‘:’ on linux or ‘;’ on windows.
Linux:
java -cp .:./classes A
Windows:
java -cp .;d:pathtodirectoryclasses A