Javaのclasspathオプションの指定

指定したパスにclassファイルがあるにもかかわらず,エラー(NoClassDefFoundError)になる場合がある.クラスパスに指定したパスの形式(DOS/Windows形式なのかCygwin/UNIX形式なのか)が原因である.

テスト用に以下のプログラムを作ってコンパイル.c:\tmpにおいた.

Sam.java

public class Sam{
  public static void main(String[] args){
    System.out.println("hello world.");
  }
}

クラスパス(-cpまたは-classpathオプション)にCygwin/UNIX形式でパスを指定すると,指定したディレクトリにclassファイルがあってもエラーとなる.

$ ls /cygdrive/c/tmp/Sam.class
/cygdrive/c/tmp/Sam.class*

$ java -cp /cygdrive/c/tmp Sam
Exception in thread "main" java.lang.NoClassDefFoundError: Sam

DOS/Windows形式なら動く.

$ java -cp c:/tmp Sam
hello world.

$ java -cp c:\\tmp Sam
hello world.

クラスパスではなくjarを指定する場合も同様である.まず,上述したサンプル用のプログラムでjarファイルを作ろう.

Sam.mf(マニフェストファイル−mainメソッドのあるクラスを記述)

Main-Class: Sam

jarファイルを作る.

$ jar cfm Sam.jar Sam.mf *.class

Cygwin/UNIX形式だとエラー.

$ ls /cygdrive/c/tmp/Sam.jar
/cygdrive/c/tmp/Sam.jar*

$ java -jar /cygdrive/c/tmp/Sam.jar
Unable to access jarfile /cygdrive/c/tmp/Sam.jar

DOS/Windows形式なら動く.

$ java -jar c:/tmp/Sam.jar
hello world.

$ java -jar c:\\tmp\\Sam.jar
hello world.