概要
いつも忘れがちなjavaコマンドについてまとめておく
javaコマンドとは
- JVMを起動するためのコマンド
- JVM起動後は、指定されたクラスをロードし、このクラスの
main
メソッドを実行する -
java 完全修飾クラス名 [引数]
の形式で実行する - ※ 完全修飾クラス名:パッケージ名を含むクラス名
例:以下のようなクラスがある場合
package com.example.demo.original;
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
- Java SE11以降で、
javac
コマンドを使わずに「ソースファイルモード」で直接実行できる。-
java ソースファイル名.java [引数]
の形式で実行する - この場合、メモリ上にコンパイル後のクラスファイルに相当するバイトコードを出力している
-
> java /Users/takumi.kuroiwa/java-silver-se-17-practice/demo/src/main/java/com/example/demo/original/Main.java
Hello, World!
-
javac
コマンドを使ってコンパイルしてから実行する場合は、コンパイルして生成されたクラスファイルを実行する-
javac 完全修飾クラス名.java
でコンパイル:javac
コマンドは「ソースファイル名.java
」を指定する -
javac -d . demo/src/main/java/com/example/demo/original/Main.java
でコンパイル:-d
オプションを使うと、指定したディレクトリにクラスファイルを出力する -
java 完全修飾クラス名 [引数]
で実行:java
コマンドで実行する際には「完全修飾クラス名」を指定する
-
> javac -d . /Users/takumi.kuroiwa/java-silver-se-17-practice/demo/src/main/java/com/example/demo/original/Main.java
> java com.example.demo.original.Main
Hello, World!
実行時はjava com.example.demo.original.Main
のように、パッケージ名を含む完全修飾クラス名を指定する。
- ソースファイルモードでの実行の際には、ファイル拡張子が
.java
はなしでも実行可能-
--source
オプションを使うと、Java SE11以降でソースファイルモードでの実行が可能
-
> mv Main.java Main
> java --source 21 Main
Hello, World!
クラス内にインナークラスがある場合
- インナークラスを含むクラスを実行する場合、インナークラスの名前も含めて完全修飾クラス名を指定する必要がある
-
javac
でコンパイルすると、Main.class と Main$InnerClass.class が生成される
-
package com.example.demo.original;
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
InnerClass inner = new Main().new InnerClass();
inner.innerMethod();
}
class InnerClass {
public void innerMethod() {
System.out.println("This is an inner class method.");
}
}
}
ソースファイルモードで実行
> java /Users/takumi.kuroiwa/java-silver-se-17-practice/demo/src/main/java/com/example/demo/original/Main.java
Hello, World!
This is an inner class method.
クラスファイルをコンパイルして実行
※ javac
コマンドでコンパイルすると、インナークラスのクラスファイルも生成される
> javac -d . /Users/takumi.kuroiwa/java-silver-se-17-practice/demo/src/main/java/com/example/demo/original/Main.java
> java com.example.demo.original.Main
Hello, World!
This is an inner class method.
javaコマンドの引数
-
java
コマンドの引数は、スペースで区切られた文字列として渡される
package com.example.demo.original;
public class Main {
public static void main(String[] args) {
System.out.println(args.length);
for (String arg : args) {
System.out.println(arg);
}
}
}
- バッククォートでエスケープされると文字として扱われるので注意
> java Main.java a \" a\" "a "b c
5
a
"
a"
a b
c
まとめ
-
java 完全修飾クラス名 [引数]
で実行 - Java11以降はソースファイルモードあり(
java ソースファイル名.java
) - javacでコンパイルする場合は
-d
オプションで出力先を指定 - インナークラスはコンパイル後、
$
記法でクラスファイルが作成される