javaコンパイルは相対パス?

javacコマンドによるコンパイルとその後のjavaコマンドによる、作成classはコンパイル時の相対パス依存するのではないかといぶかっています。このコメントは、Java勉強会第2週 - もやしもん 君にも見える菌 細菌 ウィルス 微生物に対するものです。

あるファイル SampleD2L1.javaをカレントディレクトリ で、javac SampleD2L1.javaコンパイルすると、正常にコンパイルが終了し、カレントディレクトリにSampleD2L1.classが作成され、それをカレントディレクトリで java SampleD2L1 と実行したところ、コンソールに、意図したとおりの文字列"10日で覚えるJAVA 2日目1次元目\n修飾子としてのpublic,javaプログラムを動かすための不可欠な要素であるmainメソッドの存在を読了"が、\nの改行も含めて、成功裏に出力されました。

ところが、この同じSampleD2L1.javaファイルを、一段上位のディレクトリから、javac .\SampleD2L1.javaコンパイルしたところ、コンパイルはエラーなしに実行され、.\04222005-2\SampleD2L1.class ファイルが作成されるのですが、このclassファイルを、java .\SampleD2L1 として実行してやると、『Exception in thread "main" java.lang.NoClassDefFoundError: /\04222005-2\SampleD2L1』というエラーメッセージが出ました。

ソース

今回使った、SampleD2L1.javaファイルは-->

  • 文字列表示
public class SampleD2L1{
	public static void main(String args[]){
		System.out.println("10日で覚えるJAVA 2日目1次元目\n修飾子としてのpublic,javaプログラムを動かすための不可欠な要素であるmainメソッドの存在を読了");
	}
}

その他、Java勉強会第2日で作成したプログラムを整形済みテキストで以下にアップします。

  • 四則演算
public class SampleD2L3{
	public static void main(String args[]){
		System.out.println(10+5);
		System.out.println(3*8);
		System.out.println(150/5);
		System.out.println(5120-650);
	}
}
  • 文字列結合
public class SampleD2L4{
	public static void main(String args[]){
		System.out.println("yamada");
		System.out.println("ryo");
		System.out.println("yamada"+" "+"ryo");
	}
}
  • コメント記述と変数宣言
public class SampleD2L5{
	public static void main(String args[]){

		//コメントの書き方 1行ずつ
		/*
		コメントの書き方
		複数行ずつ
		*/

		//変数宣言
		int intA;
		int intB;
		char chrA;
		byte byteA;
		short shortA;
		long longA;
		float floatA;
		double doubleA;
		boolean	booleanA;

		/*
		変数に値を代入
		char変数は、1文字格納です。
		*/
		intA = 10;
		intB = 2;
		chrA = 'y';
		byteA = 100;
		shortA = 32767;
		longA = -2345678;
		floatA = 10/3;
		doubleA = 1.41278E+22;
		booleanA = true;

		System.out.println("intAには"+intA+"が入っています");
		System.out.println("intBには"+intB+"が入っています");
		System.out.println("chrAには"+chrA+"が入っています");
		System.out.println("byteAには"+byteA+"が入っています");
		System.out.println("shortAには"+shortA+"が入っています");
		System.out.println("longAには"+longA+"が入っています");
		System.out.println("floatAには"+floatA+"が入っています");
		System.out.println("doubleAには"+doubleA+"が入っています");
		System.out.println("booleanAには"+booleanA+"が入っています");
	}
}