javacを使用してディレクトリ構造内のすべてのJavaクラスをコンパイルします
1. 概要
特別な状況では、AntやMavenなどのサードパーティのビルドツールがインストールされていません。 そして、まだたくさんのパッケージとクラスでプロジェクトをコンパイルする必要があります。
このチュートリアルでは、 javac コマンドを使用して、さまざまなシナリオでこのタスクを実行します。
2. ファイル名の使用
現在のディレクトリにsrcとoutの2つのディレクトリがあると仮定します。 src ディレクトリにはJavaソースファイルが保持され、outディレクトリには対応するコンパイル済みクラスファイルが含まれます。
簡単なシナリオから始めましょう。 src ディレクトリには、 com / baeldung /MyClassという名前の単一のJavaソースファイルが含まれています。java:
次に、 java c を使用して、MyClass。javaファイルをoutディレクトリにコンパイルします。
$ javac -d ./out/ ./src/com/baeldung/MyClass.java
上記のコマンドで、 -d オプションは、クラスファイルの宛先ディレクトリを指定します。 また、MyClass。javaファイルの正確なコードはそれほど重要ではなく、文法が正しいJavaファイルであることを確認するだけでよいことに注意してください。
少し複雑にするために、YourClass。java、HerClass。java、HisClass。javaの3つのJavaファイルを追加しましょう。 ]:
上記の4つのJavaファイルすべてをコンパイルするには、コマンドラインにそれぞれをリストします。
$ javac -d ./out/ \
./src/com/baeldung/MyClass.java \
./src/com/baeldung/YourClass.java \
./src/com/baeldung/HerClass.java \
./src/com/baeldung/HisClass.java
次に、メソッドを呼び出したり、オブジェクトインスタンスを作成したりして、他の4つのJavaファイルを参照する新しいMain。javaファイルを追加しましょう。
この場合、Main.javaファイルをコンパイルするだけで済みます。
$ javac -sourcepath ./src/ -d ./out/ ./src/com/baeldung/Main.java
上記のコマンドの後、他の4つのクラスファイルもコンパイルされます。 これは、 javac が必要なタイプを検索し、デフォルトで対応するソースファイルをコンパイルするためです。 必要な型をコンパイルしたくない場合は、 -implicit:noneオプションを追加できます。
-sourcepath オプションは、Javaコンパイラに入力ソースファイルの場所を指示します。 -sourcepath オプションが指定されていない場合、 javac はユーザークラスパスを使用して、クラスファイルとソースファイルの両方を検索します。 したがって、-sourcepathオプションを-classpathまたは-cpオプションに置き換えることができます。
$ javac -cp ./src/ -d ./out/ ./src/com/baeldung/Main.java
ただし、このアプローチには制限があります。javacコマンドは必要なタイプのみをコンパイルし、他のソースファイルを省略します。 たとえば、新しいItsClass。javaを追加し、Main。javaがそれを参照しない場合、ItsClass。javaはコンパイルされません:
要約すると、 javac コマンドラインにファイル名を一覧表示するのに適したシナリオが2つあります。Javaソースファイルが数個しかない場合と、他のクラスを再帰的に参照するランチャークラスがある場合です。
3. ワイルドカードの使用
javac コマンドは、同じディレクトリ内の複数のソースファイルをコンパイルするためのワイルドカード文字(*)もサポートしています。
たとえば、ワイルドカードを使用して上記のソースファイルをコンパイルできます。
$ javac -d ./out/ ./src/com/baeldung/*.java
シナリオをさらに複雑にするために、4つのサブパッケージ( spring 、 summer 、 autumn 、および winter )と対応するクラスを追加しましょう。
これで、コマンドラインで、ワイルドカードを使用して各パッケージを一覧表示し、すべてをコンパイルできます。
$ javac -d ./out/ \
./src/com/baeldung/*.java \
./src/com/baeldung/spring/*.java \
./src/com/baeldung/summer/*.java \
./src/com/baeldung/autumn/*.java \
./src/com/baeldung/winter/*.java
パッケージの数が少ない場合は、ソースファイル番号に関係なく、このワイルドカードアプローチを使用するのが適切です。
4. 引数ファイルの使用
コンパイルするパッケージが複数ある場合は、引数ファイルを指定してjavacコマンドを使用すると便利です。 引数ファイルには、javacオプションとソースファイル名の両方を含めることができます。
引数ファイルを使用するには、引数ファイル名の前にアットマーク( @ )の先頭文字を追加する必要があります。
$ javac -d ./out/ @sources.txt
しかし、どうすればそのような @ sources.txtファイルを生成できますか? これは、使用しているOSによって異なります。 LinuxまたはmacOSでは、findコマンドを使用できます。
$ find ./src/ -type f -name "*.java" > sources.txt
上記のコマンドラインでは、 ./ src / が検索の開始点ディレクトリであり、タイプのf オプションは通常のファイルのみをフィルタリングし、-name“ * .java” オプションは、拡張子が.javaのすべてのファイル名と一致します。
ただし、Windowsでは、dirコマンドを使用できます。
> dir src /b /s *.java > sources.txt
上記のコマンドラインでは、 src フォルダーが検索パスであり、 / b スイッチは追加情報なしでディレクトリとファイル名を表示し、 / s オプションは、指定されたディレクトリとすべてのサブディレクトリ内のすべてのファイルを一覧表示します。
このアプローチの欠点は、新しいJavaソースファイルを追加したり、既存のJavaソースファイルを削除したりするたびに、sources.txtファイルを再生成する必要があることです。
5. その他のアプローチ
上記の一般的なアプローチに加えて、 globstar やパイプの使用など、OSに依存する他のアプローチもあります。
5.1. Globstarを使用する
Bashバージョン4.0では、 globstar と呼ばれる新しいグロブオプションが追加され、ダブルワイルドカード( ** )の扱いが異なります。 これを有効にすると、Bashはマルチレベルディレクトリをトラバースします。 それ以外の場合、Bashは単一レベルのディレクトリのみを検索します。
ただし、このオプションはデフォルトで無効になっています。 また、 shopt (sh + opt、shell options)コマンドを使用して、Bashオプションの設定を調べることができます。 引数なしでshoptコマンドを実行すると、オプションとそのステータスの長いリスト(onまたはoff)が出力されます。
現在、globstarオプションのみに関心があります。
$ shopt globstar
globstar off
これを有効にするには、shoptコマンドを-sオプションとともに使用します。
$ shopt -s globstar
これを無効にするには、-uオプションを指定してshoptコマンドを呼び出します。
$ shopt -u globstar
このオプションを有効にすると、ダブルワイルドカードを使用してjavacを呼び出すことができます。
$ javac -d ./out/ ./src/**/*.java
5.2. パイプの使用
概念的には、パイプは2つのプロセス間の接続です。 また、このパイプメカニズムを利用して、複数のコマンドを接続し、目的の結果を生成できます。
Javaソースファイルをコンパイルするには、 find 、 xargs 、およびjavacコマンドを組み合わせることができます。
$ find ./src/ -type f -name "*.java" | xargs javac -cp ./src/ -d ./out/
また、 find コマンドは、-execアクションをサポートします。
$ find ./src/ -type f -name "*.java" -exec javac -cp ./src/ -d ./out/ '{}' ';'
上記のコマンドラインの実行速度が少し遅くなる場合があります。 これは、一致したファイルごとにjavacコマンドが実行されるためです。 詳細については、 man find コマンドを使用して、-execオプションのドキュメントを読むことができます。
もう少し速くするために、セミコロン(;)をプラス記号(+)に変更できます。 次に、 javac コマンドは、一致したすべてのファイルを収集し、1回だけ実行します。
$ find ./src/ -type f -name "*.java" -exec javac -cp ./src/ -d ./out/ '{}' +
6. 結論
この記事では、最初に、ファイル名、ワイルドカード、引数ファイルを使用するなど、ディレクトリ構造内のすべてのJavaソースファイルをコンパイルするためのいくつかの一般的なアプローチについて説明しました。 次に、 globstar やパイプの使用など、OSに依存するいくつかのアプローチを検討しました。