Problem
บางครั้งเวลาเรารันโปรแกรมจาวาที่เขียนขึ้น แล้วได้ error java.lang.NoClassDefFoundError อย่างเช่น ถ้าเราเขียนโปรแกรม HelloWorld โดยเก็บไฟล์ HelloWorld.java ไว้ที่ d:\java\test แล้ว compile ด้วยคำสั่ง javac d:\java\test\HelloWorld.java (โดย directory ปัจจุบันเป็น d:\java) เมื่อรันคำสั่ง java HelloWorld แล้วได้ error ตามที่แสดงข้างล่างนี้
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
Cause
ที่เกิด error ขึ้นแบบนี้ ก็เพราะว่า Java interpreter (Java VM) หา class file ของโปรแกรม HelloWorld ไม่เจอ โดยปรกติแล้ว Java VM จะหา user class file โดยดูจาก classpath ที่เราได้ระบุไว้ ซึ่งถ้าเราไม่ได้ระบุ ค่า default ของ classpath จะเป็น current directory หรือ directory ปัจจุบัน ในกรณีของตัวอย่างนี้ ปัญหาเกิดขึ้นจากการที่เรา compile HelloWorld.java ใน d:\java\test ทำให้ class file (HelloWorld.class) ถูกสร้างขึ้นใน directory d:\java\test เนื่องจากค่า default ของ classpath คือ directory ปัจจุบัน (d:\java) ทำให้เมื่อเราพยายามจะรันโปรแกรมจาก directory d:\java Java VM ก็จะพยายามหา class file ของ HelloWorld (HelloWorld.class) ใน d:\java ทำให้หาไม่เจอ
Solution
วิธีแก้ไขก็ไม่ยากอะไร ถ้าเราไม่ต้องการ set ค่า classpath เราก็ควรเปลี่ยน directory ปัจจุบันให้เป็น directory ที่มี class file นั้นอยู่เสียก่อน อย่างในกรณีนี้ เราก็ควรเปลี่ยนไป directory d:\java\test ก่อนที่รันค่ำสั่ง java HelloWorld แต่ถ้าเราต้องการระบุค่าของ classpath ก็สามารถทำได้สองวิธีคือ
1. set ค่าของ CLASSPATH environment variable
โดย set ให้รวมถึง path ที่ class file อยู่ อย่างเช่น
พิมพ์คำสั่ง set CLASSPATH=d:\java\test;. ที่ command prompt
Note: การ set classpath แบบนี้จะใช้ได้แค่ใน console นี้เท่านั้น ถ้าการ set แบบถาวรต้อง set เป็น system variable โดยเข้าไปที่ My Computer > Properties > Advanced > Environment Variables > System Variables แล้วเพิ่มตัวแปร CLASSPATH เข้าไป
2. ระบุค่า classpath โดยใช้ option -classpath หรือ -cp ของ Java interpreter (วิธีนี้จะดีกว่าแบบที่ (1) เพราะว่าการรันโปรแกรมจาวาแต่ล่ะครั้งจะใช้ classpath ที่ระบุ ทำให้เมื่อเรารันโปรแกรมจาวามากกว่า 1 ตัว ก็จะใช้ classpath แยกกัน ช่วยให้ไม่สับสนเวลาหา class จึงแนะนำให้ใช้แบบนี้)
java -cp d:\java\test;. HelloWorld หรือ
java -classpath d:\java\test;. HelloWorld
สองวิธีนี้จะช่วยให้เราสามารถรันโปรแกรม HelloWorld จาก directory ไหนก็ได้ โดยไม่จำเป็นจะต้องอยู่ใน directory ที่ class file ของโปรแกรมนั้นอยู่