Solved

Classpath Issue?

Posted on 2009-05-15
8
281 Views
Last Modified: 2013-12-29

1).class1.java is in c:\a\b\folder1

2).Compiled with no issues: C:\a\b>  javac -classpath c:\a\b   folder1\class1.java

3).Tried to run the generated class file: C:\a\b>java -classpath c:\a\b folder1.class1

4).Error Stack:   Exception in thread "main" java.lang.NoClassDefFoundError: folder1/class1 (wrong name: a/b/folder1/class1)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        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)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

What mistake did I commit in classpath and/or folder structure?

Thanks

Roopesh
Code of c:\a\b\folder1\class1.java
-----------------------------------------------------
package a.b.folder1;
 
class class1{
 
public void f1(){
System.out.println("FUNCTION OF CLASS1");
}
 
public static void main(String[] argsss)   
{
System.out.println("MAIN OF CLASS1");
}
}

Open in new window

0
Comment
Question by:perfect_tranquility
  • 3
  • 2
  • 2
  • +1
8 Comments
 
LVL 17

Expert Comment

by:Thomas4019
ID: 24399902
Try running by

 java -classpath c:\ class1
0
 
LVL 92

Assisted Solution

by:objects
objects earned 200 total points
ID: 24400146
java -classpath c:\ a.b.folder1.class1

0
 
LVL 3

Accepted Solution

by:
avdej earned 300 total points
ID: 24414072
You have put your class into package 'a.b.folder1'
Thus the fully qualified name of your class is: 'a.b.folder1.class1'
To properly compile and run it please do the following:
1. cd C:\
2. C:\> javac .\a\b\folder1\class1.java
3. C:\> java a.b.folder1.class1

Alternatively you can run your compiled class staying anywhere in a file hierarchy with:
3a. C:\someFolder\> java -cp C:\ a.b.folder1.class1

Avdej
0
Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

 

Author Comment

by:perfect_tranquility
ID: 24425655
Avdej:

Kudos

1 and 2 worked.
3 did not.
3a. did


Avdej, can we use -cp for javac command also? If yes, could you give explain based on above?

Thanks.  You not only provided a good solution but also had time to write and explain it.
0
 

Author Comment

by:perfect_tranquility
ID: 24425831
Avdej,

I have two questions here:

Question 1:
I also notice that if I do c:\somefolder and then try 3a, it fails,why?
e.g. I navigated to c:\Program Files and did the following two and got the same error

1).java  -cp c:\a\b      folder1.class1
2).java -cp c:\           a.b.folder1.class1

Error got:

C:\>java -cp c:\a\b  folder1.class1
Exception in thread "main" java.lang.NoClassDefFoundError: folder1/class1 (wrong
 name: a/b/folder1/class1)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        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)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

Question 2:

in java.exe command am I supposed to use -cp only with c:\  like java -cp c:\ something_here
or can I start the class path from anywhere say:   java -cp c:\somedirstructure  rest_of_command

Thanks
0
 
LVL 3

Expert Comment

by:avdej
ID: 24426844
Well, the point to understand the issue is:
1. You should have some ROOT directory to build your class structure from, e.g. C:\JavaWork
2. CLASSPATH value points TO THIS root directory and thus allows the JVM (i.e. java.exe) to find the classes you attempt to execute (that is the meaning of the option: '-cp C:\JavaWork')
3. Your classes are organized in packages (simply put: folders) placed underneath the root, i.e. subfolders of C:\JavaWork

Suppose now you have written java class named MyClass (stored as MyClass.java file) and want it to belong to package 'a.b.c'. Then you will have to:
1. Create directory structure: C:\JavaWork\a\b\c (e.g. run: C:\> mkdir C:\JavaWork\a\b\c)
2. Place the following line as the very first line of code into your class code:
    package a.b.c;
3. Save MyClass.java file in directory C:\JavaWork\a\b\c
    (i.e. you should now have file: C:\JavaWork\a\b\c\MyClass.java)

Now you are ready to compile and run your java class:
1. You can compile your class staying anywhere as long as you specify to javac.exe the path where to find the java source file. Thus any of the following will work:
C:\JavaWork> javac .\a\b\c\MyClass.java
C:\> javac .\JavaWork\a\b\c\MyClass.java
D:\someFolder>javac C:\JavaWork\a\b\c\MyClass.java
Simply put: javac.exe (the compiler) is not concerned about any PACKAGES. It just finds and compiles the source file specified.

2. BUT java.exe (the interpreter) behaves in that point very differently: it insists that class to run is named with its fully specified name, i.e: 'a.b.c.MyClass' (in order to distinguish it from some another class, say x.y.z.MyClass)
Now, thus the class name is prefixed with 'a.b.c' then java.exe will try to look for the class file using RELATIVE path .\a\b\c\MyClass.class from some ROOT directory fetched by means of CLASSPATH value provided (i.e.: -cp C:\JavaWork).
Therefore in order to run your classes successfully you have TWO possibilities:
1.
a) Define environment variable named CLASSPATH holding 'C:\JavaWork' entry as well as all other ROOTS of your class file locations  (like PATH for seeking exe files).
b) THEN you can run your class (and any of your classes) just by typing from anywhere:
*>java a.b.c.MyClass

2. Define a special (one-time) classpath value EVERY TIME you run your class. That is what you do typing commands like:
C:\JavaWork> java -cp . a.b.c.MyClass
C:\> java -cp .\JavaWork a.b.c.MyClass
D:\someFolder> java -cp C:\JavaWork a.b.c.MyClass

Hope this helps :-)

Avdej


0
 

Author Comment

by:perfect_tranquility
ID: 24434137
Avdej,

Kudos to you for 2 things:

2). you took pain to explain to me the concept as one who knows should(in my view, but in real world hardly is the case) giving examples that I always prefer, Examples were very concise!


1). By doing above, you have brought back the old flavor of experts exchange. This in total contrast to present when either I dont see too many responses or if I do, all I see is a 1 liner.

Please watch out for my new  questions that will keep popping thru the week, weekend and beyond
Thanks again and God Bless

Roopesh
0
 
LVL 92

Expert Comment

by:objects
ID: 24437169
yes the site has deteriorated a bit over the years, I find myself contributing a lot less here these days.

0

Featured Post

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
firstswap challenge 20 77
Spring Framework HTTPSession management 1 33
Opening PDF on button click and fill new document 2 35
Tomcat: Unable to run tomcat service. 2 18
Java functions are among the best things for programmers to work with as Java sites can be very easy to read and prepare. Java especially simplifies many processes in the coding industry as it helps integrate many forms of technology and different d…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
Viewers learn about the “for” loop and how it works in Java. By comparing it to the while loop learned before, viewers can make the transition easily. You will learn about the formatting of the for loop as we write a program that prints even numbers…
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …

816 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now