Java Webアプリケーションのアセンブリと配信を高速化します

TLTD







  1. プロジェクトビルドからjarを削除しました
  2. 7倍高速なタスクに置き換えました








カットの下の詳細と結果。







プロジェクトについて



残りのAPIwebsocketを提供する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
      
      





タスク







  1. すべてのクラスとリソースを展開されたフォルダーに入れます
  2. すべてのランタイム依存関係をlibフォルダーに入れます
  3. explosedJarを追加し、。/ gradleビルドからタスクjarを除外します


もう一度走る







 ./gradlew build --profile
      
      





結果をお楽しみください



ここで再びコメントは必要ないと思います。













ここでは、まだ記事の最初からヒストグラムを複製する価値がありますが、私はこれを行いません。







しかし、展開方法は?



この記事を非常に長くしないために、1つのコマンドを残してプロジェクトをサーバーにコピーします。







 rsync --delete -r build/exploded api.example.com:/opt/myapp
      
      





まとめ






All Articles