1。序文
通常の状況では、クラスローダーは、現在のディレクトリまたはJARのファイルクラスに *.classファイルのみを見つけることができます。ネストされた瓶にリソースをロードするために、ネストされた瓶とアプリケーションのクラスファイルにクラスファイルが瓶にパッケージ化されているため、ネストされた瓶がありません。ただし、そうすることで、アプリケーションがどのようなアプリケーションに依存しているのかを明確に知ることはできません。さらに、複数の瓶のクラスコンテンツは異なる場合がありますが、ファイル名は同じです。スプリングブートのスプリングブートローダーは、この問題を優雅に解決するために生まれました。
Spring-Boot-Roaderモジュールを使用すると、Java -Jar archive.jarを使用して、ネストされた依存関係を含むJARまたはWARファイルを実行できます。 3種類のランチャー(Jarlauncher、Warlauncher、PropertiesLauncher)を提供します。これらのクラスランチャーの目的は、JAR(クラスファイル、構成ファイルなど)にネストされたリソースをロードできることです。 [jar | war]ランチャーは、現在のjarのlibディレクトリにあるネストされたjarファイルのリソースを正当に検索します。
2。スプリングブートローダーモジュールによって提供されるjarディレクトリ構造
スプリングブートのJARファイル形式は次のように修正されます。
archive.jar | +-META-INF(1)| +-manifest.mf +-org(2)| +-SpringFrameWork | +-boot | + - ローダー| + - <スプリングブートローダークラス> +-com(3)| +-Mycompany | +プロジェクト| +-youclasses.class +-lib(4) +dependency1.jar +-dependency2.jar
では、この構造に応じて、スプリングブートはどのようにロードリソースをロードしますか?
メインクラス:org.springframework.boot.loader.jarlauncher start-class:com.mycompany.project.myapplication
スプリングブートローダーパッケージのクラスファイルを構造(2)にコピーし、アプリケーションの依存関係をコピーして(4)アプリケーションクラスを(3)にコピーします
3。スプリングブートマベン - プラギンプラグインパッケージプロセスの分析
注:ここでは、クラスをコピーしてSpring-Boot-Roader.jarに配置する必要がある構造(2)にコピーする必要がある理由を考える必要があります。
4。Jarlauncher実行プロセス分析
このプロセスを読んだ後、3番目のセクションに残された問題を分析します。たとえば、FlowChartは最初にAppClassLoaderを使用してJarlauncherクラスをロードし、LaunchEdurlClassloaderクラスを作成します。 LaunchEdurlClassLoaderはSpring-Boot-Roader.jarパッケージに属し、AppClassLoaderはネストされた瓶にファイルをロードできない通常のローダーです。したがって、Spring-Boot-Roader.jarがLIBディレクトリに配置されている場合、AppClassLoaderはLaunchEdurlClassloaderを見つけません。梱包するとき
クラスをコピーして、spring-boot-loader.jarに入れられるべきである構造(2)
5。概要
スプリングブートロードモジュールは、カスタムJARパッケージ構造を介してネストされたJARリソースの負荷をエレガントに実装します。パッケージング中にスタートアップクラスと組織のJAR構造をリセットし、実行時にカスタムローダーを設定して、ネストされたJARリソースを実現します。