4

maven-shade-plugin を使用して、いくつかの Clojure ライブラリといくつかの Java を含む jar アーティファクトをパッケージ化する場合。Clojure コードには AOT コンパイルを使用していました。jar をロードすると、ロード時間が非常に遅くなりました。AOT コンパイルはこれにかなり役立つはずですが、実際にはそうではありませんでした。Clojure クラスがロードされているときに、Java jar -verbose の出力で、JVM__DEFINE_CLASS呼び出しが多数発生していることに気付きました。

Clojure コードの多くが .class ファイルに AOT コンパイルされていたため、これは意味がありませんでした。

maven-shade-plugin はすべての新しいファイルを作成し、最終アーティファクトに新しいタイムスタンプが含まれていることがわかりました。Clojure は .clj ファイルと .class ファイルのタイムスタンプ情報を使用して、ファイルを再コンパイルする必要があるかどうかを判断します。maven-shade-plugin により、.clj ファイルと関連する .class ファイルのタイムスタンプが同じになるため、Clojure は常にソースを動的に再コンパイルすることを選択していました。

現時点で判明している唯一の回避策は、シェーディングされた jar を再度開き、.clj ファイルのタイムスタンプを過去のある時点に戻すスクリプトを作成することです。関連する .class ファイルのタイムスタンプと等しくなります。

誰もがより良いアプローチを知っていますか?

4

1 に答える 1

2

これが良いかどうかはわかりませんが、jar から clojure ソースを除外することも選択できます。これにより、それらが再コンパイルされなくなります。lein でビルドし、pack200 で圧縮すると、これに遭遇しました。詳細はこちら:

jwrapper でビルドされた jar が機能しない

ファイルを除外するためのMavenオプションはわかりませんが、leinを使用すると、 #".(clj|java)" のような除外パターンをドロップしてソースファイルを除外できます。

于 2014-12-10T23:41:51.987 に答える