私はShakeを使用して Java コードをビルドする実験を行っていますが、javac コンパイラの異常な性質のために少し行き詰っています。一般に、大規模なプロジェクトの各モジュールでは、そのモジュールのすべてのソース ファイルを入力としてコンパイラが呼び出され、1 回のパスですべての出力ファイルが生成されます。その後、通常、コンパイラによって生成された .class ファイルを取得し、それらを JAR (基本的には単なる ZIP) にアセンブルします。
たとえば、典型的な Java モジュール プロジェクトは次のように配置されます。
- 複数の .java ファイルを含む
src
ディレクトリ。そのうちのいくつかは、ツリー内の何層にもネストされています。 - コンパイラからの出力を含む
bin
ディレクトリ。通常、この出力は同じディレクトリ構造とファイル名に従い、.class
各 .java ファイルが置き換えられますが、マッピングは必ずしも 1 対 1 であるとは限りません。
したがって、シェイクで定義したいルールは次のとおりです。
1)下のファイルが下のどのファイルよりもsrc
新しい場合は、すべての内容を消去し、次のように再作成します。bin
bin
javac -d bin <recursive list of .java files under src>
この規則が過剰に思えることはわかっていますが、コンパイラーを起動しないと、単一の入力ファイルのわずかな変更によって生じる出力の変化の程度を知ることはできません。
2)以下のいずれかのファイルがそれbin
よりも新しい場合は、次のようmodule.jar
に再作成module.jar
します。
jar cf module.jar -C bin .
どうもありがとう!
PS「Ant/Maven/Gradle/を使用するだけ」という静脈内の応答は高く評価されません! これらのツールがすぐに使える Java コンパイルを提供することは知っていますが、それらを作成して集約するのははるかに困難です。これが、私が Haskell/Shake ベースのツールを試してみたい理由です。