1. 概要

このチュートリアルでは、コマンドラインインターフェイスを介してJavaコンパイラと対話する方法を学習します。

前提条件として、 Java をダウンロードし、JAVA_HOME環境変数をマシンに構成する必要があります。

2. 単一のJavaソースコードファイルのコンパイル

Javaは、Javaソースコードファイルをコンパイルするためのシンプルなツールjavacを提供します。 小さなクラスCar。javaのコンパイルから始めましょう。

public class Car {
    private String make;
    private String model;

   // standard setters and getters
}

このファイルが置かれているディレクトリ内の単一のコマンドからこれをコンパイルできます。

javac Car.java

すべてがエラーなしで機能する場合、出力はありません。 コンパイラは、現在の作業ディレクトリに、バイトコードを含む Car.class、を作成します。

3. 複数のソースコードファイルのコンパイル

通常、私たちのプログラムは複数のクラスファイルを使用します。 ここで、複数のクラスを持つ単純なプログラムをコンパイルする方法を見てみましょう。

まず、Owner。javaHistory。javaの2つの新しいタイプを追加しましょう。

public class Car {
    private String make;
    private String model;
    private Owner owner;
    private History history;
}
public class Owner {
    private String name;
}
public class History {
    private String details;
}

次に、以下のコマンドを実行してコンパイルする必要があります。

javac Owner.java Car.java History.java

Carクラスで使用されるクラスは同じディレクトリにあるため、実際にはそれらを指定するかどうかはオプションであることに注意してください。 まだコンパイルできます Car.java

4. 重要なJavaコンパイラオプション

これまで、クラス名をパラメーターとして渡すだけで、追加のオプションなしでjavacコマンドを使用してきました。 ただし、カスタマイズすることもできます。 ライブラリのクラスを見つける場所、コードが存在するベースパス、および最終的な結果を生成する場所をJavaコンパイラに指示できます。

これらのオプションのいくつかを詳しく見てみましょう。

  • -cpまたは-クラスパス
  • -ソースパス
  • -d (ディレクトリ)

4.1. -cpまたは-classpathオプションとは何ですか?

クラスパスを使用して、コンパイル中にソースコードが依存する*。jar*。zipなどのディレクトリまたはファイルのセットを定義できます。 または、CLASSPATH環境変数を設定することもできます。

クラスパスオプションは環境変数よりも優先されることに注意してください。

それらのいずれも指定されていない場合、クラスパスは現在のディレクトリであると見なされます。 複数のディレクトリを指定する場合、パス区切り文字は、Windowsを除くほとんどのオペレーティングシステムで「」であり、「;」です。

4.2. -sourcepath オプションとは何ですか?

このオプションを使用すると、コンパイルが必要なすべてのソースコードが存在する最上位ディレクトリを指定できます。

指定しない場合、クラスパスはソースをスキャンされます。

4.3. -d オプションとは何ですか?

このオプションは、コンパイルされたすべての結果をソースコードとは別に1か所にまとめたい場合に使用します。 指定するパスは事前に存在している必要があることに注意する必要があります

コンパイル中、このパスはルートディレクトリとして使用され、サブフォルダはクラスのパッケージ構造に従って自動的に作成されます。 このオプションが指定されていない場合、すべての*。classファイルは、対応するソースコード*。javaファイルの隣に書き込まれます。

5. 外部ライブラリを使用したコンパイル

作成するクラスに加えて、プログラムで外部ライブラリを使用する必要もあります。 より複雑な例を見てみましょう。

libs/
├─ guava-31.1-jre.jar
model/
├─ Car.java
├─ History.java
├─ Owner.java
service/
├─ CarService.java
target/

ここでは、クラスをパッケージに編成しました。 さらに、targetディレクトリとlibsディレクトリを導入して、コンパイルされた結果とライブラリをそれぞれ配置しました。

Guavaライブラリによって提供されるImmutableSetクラスを使用するとします。 ダウンロードしてlibsフォルダーに配置します。 次に、サービスパッケージの下に、CarService.javaの外部ライブラリを使用する新しいクラスを導入します。

package service;

import model.Car;
import java.util.Set;

import com.google.common.collect.ImmutableSet;

public class CarService {

    public Set<Car> getCars() {

        Car car1 = new Car();
        Car car2 = new Car();

        ImmutableSet<Car> cars = ImmutableSet.<Car>builder()
          .add(car1)
          .add(car2)
          .build();
        return cars;
    }
}

次に、プロジェクトをコンパイルします。

javac -classpath libs/*:. -d target -sourcepath . service/CarService.java model/*.java

-cpを使用してクラスパスにlibsフォルダーを含めました。

libs/
├─ guava-31.1-jre.jar
model/
├─ Car.java
├─ History.java
├─ Owner.java
service/
├─ CarService.java
target/
├─ model/
│ ├─ Car.class
│ ├─ History.class
│ ├─ Owner.class
├─ service/
│ ├─ CarService.class

ご覧のとおり、 javac は、外部の ImmutbleSet クラスを正常に解決し、コンパイルされたクラスをtargetフォルダーに配置しました。

6. 結論

この記事では、外部ライブラリに依存している場合でも、複数のソースコードファイルをコンパイルする方法を学びました。

さらに、複雑なコンパイルタスクで利用できるいくつかの重要なオプションについて簡単に説明しました。