【Java】コンパイルなしで実行するには

実行の流れ

Javaのソースコードを実行するには、

  1. javacコマンドでコンパイル(ソースコードからバイトコードに変換)
  2. javaコマンドで実行(バイトコードから機械語に変換)

という流れが一般的です。

しかし、Java SE 11からは、条件付きでjavaコマンドだけで実行できるようになりました。

コンパイルなしで実行できる条件

  • 1つのソースファイルでプログラムが完結している
  • 1つのソースファイル内に複数のクラスがある場合、mainメソッドを持つクラスを先頭に宣言する
  • クラスパス上に同じ名前のクラスファイルがあってはならない

以上、3点になります。1つずつ見ていきましょう。

1つのソースファイルでプログラムが完結している

これは、拡張子がjavaのファイル内でプログラムが動くという条件です。

public class Main{
    public static void main(String[] args){
        System.out.println("Hello World.");
    }
}

他のソースファイルからクラスを呼び出す場合、該当しません。

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メソッドを持つクラスを先頭に宣言する

具体例でいうと以下のような場合、該当します。

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コマンドだけで実行できません。

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コマンドだけで実行できません。

同名のクラスファイルを移動するなり、削除するなり避けて実行しましょう。