Java コンパイル時のソースパスとクラスファイル出力先を指定する
Java ソースコードのツリーと生成物のツリーを分ける
「Java のパッケージ」で説明したようにパッケージを使ってファイルを整理していくと、 ソースツリーの階層構造が深くなりがちです。
それと同時に、デフォルトの設定ではソースファイルと同じディレクトリ内にクラスファイルが生成されるため、 コンパイルの結果生成されるクラスファイルもあちこちに散らばってしまいます。
ソースファイルと、生成物であるクラスファイルは、それぞれ別のディレクトリツリーとしたほうが管理が簡単なことが多いです。
ここでは Java のソースコードのコンパイル時に、ソースパスやクラスファイルの出力先を指定する方法を説明します。
Java ソースコードの準備とディレクトリ構造
ここでは具体的にコンパイルを実行するために、ソースコード TestApp.java と Person.java を次のように準備します。
package com.keicode;
import com.keicode.models.Person;
public class TestApp {
public static void main(String[] args) {
Person p = new Person(20, "John Doe");
p.printName();
p.printAge();
}
}
Person.java は次の通りです。
package com.keicode.models;
public class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public void printName() {
System.out.println(this.name);
}
public void printAge() {
System.out.println(this.age);
}
}
ディレクトリの関係は次のようにします。
tree
.
└── src
└── com
└── keicode
├── TestApp.java
└── models
└── Person.java
4 directories, 2 files
Java ソースパスを指定してコンパイルする
コンパイルするには、src ディレクトリにて、次のようにします。
javac ./com/keicode/TestApp.java
もし src ディレクトリの親ディレクトリで javac を実行するなら、-sourcepath オプションを指定します。
javac -sourcepath src src/com/keicode/TestApp.java
-sourcepath を指定しない時には、クラスを発見するためにクラスパスを探します。
コンパイルの結果、 *.class ファイルがソースファイル *.java ファイルと同じ場所に作成されます。
tree
.
└── com
└── keicode
├── TestApp.class
├── TestApp.java
└── models
├── Person.class
└── Person.java
3 directories, 4 files
デフォルトではソースパスと同じ場所にクラスファイル (*.class) が生成されます。
クラスファイルの出力場所を指定
-d オプションを使うと、クラスファイルを出力するディレクトリを指定することができます。
javac -d out -sourcepath src src/com/keicode/TestApp.java
この結果、*.class ファイルはソースツリーとは別のツリーに出力されます。
tree
.
├── out
│ └── com
│ └── keicode
│ ├── TestApp.class
│ └── models
│ └── Person.class
└── src
└── com
└── keicode
├── TestApp.java
└── models
└── Person.java
8 directories, 4 files
以上で、コンパイル時のソースパスの指定方法と、クラスファイルの出力場所の指定方法を説明しました。