TLTD
- プロジェクトビルドからjarを削除しました
- 7倍高速なタスクに置き換えました
カットの下の詳細と結果。
プロジェクトについて
残りのAPIとwebsocketを提供するJavaのWebサービスですが、内部では分散データベースと分散キャッシュにアクセスできます 。
このプロジェクトは、 組み込みの桟橋を使用して開始され、 public status void method
を通じて起動されpublic status void method
。
ファットjarとしてサーバーに配信され、 java -jar myapp.jar app.yaml
介して起動されます。
プロフィール
Gradleは、プロファイラーを使用してすぐに使用できる優れたツールです。 --profile
オプションを使用してビルドを実行し、結果を待ちます。
./gradlew clean build --profile
結果にコメントする必要はないと思います:
問題を研究します
まず、太ったjarがどのように作成されるかを確認することにしました。
jar { manifest { attributes "Main-Class": "com.baeldung.fatjar.Application" } from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } }
マニフェストで、mainメソッドを使用してクラスを記述し、jar依存関係をjarアーカイブのルートフォルダーに解凍します。
これは、jar unzip myapp.jar
をunzip myapp.jar
し、現在のtree .
フォルダでツリーを調べることで確認できますtree .
これが遅いことは驚くことではありません。 多くの小さなファイルを最初に解凍してからバックアップする必要があります 。
最適化
次に、jarファイル作成の高速バージョンをグーグルで試しました。
私はgradleプラグインを試しました:
gradle-fatjar-plugin-サポートされなくなりました
シャドウ -彼らはそれらを収集することができましたが、上記と同じ方法を使用しているため、これは速度の増加を与えませんでした
gradle-one-jar-まったく起動できませんでした、正直なところ、もっと時間をかける必要があっただけかもしれません
それから私はアイデアを得た、あなたも挑戦を言うことができます。 そして、jarなしでアプリケーションを実行する方法は? これを試すために、アーカイブを解凍しました。
それは難しくないことが判明しました:
java -cp . com.example.Main app.yml
プロジェクトは完全に開始され、目的の構成を選択しました。
-cpパラメーターは、すべてのプロジェクトクラスが配置されているプロセスをJavaに伝えるクラスパスです。
だから、プロジェクトはjarなしで生きることができますか? gradleコミュニティから少し助けを借りて 、jarの展開バージョンを作成するタスクがありました:
task explodedJar(type: Copy) { with jar into "${buildDir}/exploded" into('lib') { from configurations.runtimeClasspath } } jar.enabled = false assemble.dependsOn explodedJar
タスク
- すべてのクラスとリソースを展開されたフォルダーに入れます
- すべてのランタイム依存関係をlibフォルダーに入れます
- explosedJarを追加し、。/ gradleビルドからタスクjarを除外します
もう一度走る
./gradlew build --profile
結果をお楽しみください
ここで再びコメントは必要ないと思います。
ここでは、まだ記事の最初からヒストグラムを複製する価値がありますが、私はこれを行いません。
しかし、展開方法は?
この記事を非常に長くしないために、1つのコマンドを残してプロジェクトをサーバーにコピーします。
rsync --delete -r build/exploded api.example.com:/opt/myapp
まとめ
- プロジェクトは、
jar
などのエンティティを削除したため、より簡単になりました。 -
build/exploded
開くだけで、アセンブリに何が入っているかを常に確認できbuild/exploded
- そしてもちろん、プロジェクトはより速く組み立てられ、共有され始めました