実行の流れ
Javaのソースコードを実行するには、
- javacコマンドでコンパイル(ソースコードからバイトコードに変換)
- javaコマンドで実行(バイトコードから機械語に変換)
という流れが一般的です。
しかし、Java SE 11からは、条件付きでjavaコマンドだけで実行できるようになりました。
コンパイルなしで実行できる条件
- 1つのソースファイルでプログラムが完結している
- 1つのソースファイル内に複数のクラスがある場合、mainメソッドを持つクラスを先頭に宣言する
- クラスパス上に同じ名前のクラスファイルがあってはならない
以上、3点になります。1つずつ見ていきましょう。
1つのソースファイルでプログラムが完結している
これは、拡張子がjavaのファイル内でプログラムが動くという条件です。
![](https://enjoy-pglife.com/wp-content/uploads/Articles/2023/スライド2-1-160x160.png)
public class Main{
public static void main(String[] args){
System.out.println("Hello World.");
}
}
他のソースファイルからクラスを呼び出す場合、該当しません。
![](https://enjoy-pglife.com/wp-content/uploads/Articles/2023/スライド3-1-160x160.png)
public class Main{
public static void main(String[] args){
int result = Calc.sum(1,1);
}
}
public class Calc{
public static int sum(int i, int j){
return i + j;
}
}
大規模開発する場合、1つのソースファイルで完結することは、まずないのでjavaコマンドだけで実行というのは現実的ではないです。
1つのソースファイル内に複数のクラスがある場合、
mainメソッドを持つクラスを先頭に宣言する
具体例でいうと以下のような場合、該当します。
![](https://enjoy-pglife.com/wp-content/uploads/Articles/2023/スライド2-1-160x160.png)
public class Main{
public static void main(String[] args){
int result = Calc.sum(1,1);
}
}
class Calc{
public static int sum(int i, int j){
return i + j;
}
}
mainメソッドを持たないクラスが先頭に宣言されている場合、javaコマンドだけで実行できません。
![](https://enjoy-pglife.com/wp-content/uploads/Articles/2023/スライド3-1-160x160.png)
class Calc{
public static int sum(int i, int j){
return i + j;
}
}
public class Main{
public static void main(String[] args){
int result = Calc.sum(1,1);
}
}
クラスパス上に同じ名前のクラスファイルがあってはならない
Main.javaを実行しようとする際、すでにMain.classがある場合、javaコマンドだけで実行できません。
同名のクラスファイルを移動するなり、削除するなり避けて実行しましょう。