Spring Bootを使ったシンJAR

1前書き

このチュートリアルでは、https://github.com/dsyer/spring-boot-thin-launcher[ spring-boot-thinを使用して、Spring BootプロジェクトをシンJARファイルにビルドする方法** について説明します。 -launcher ]プロジェクト。

Spring Bootは、「実行可能な」JARデプロイメントで知られています。そこでは、単一の実行可能成果物にアプリケーションコードとそのすべての依存関係の両方が含まれています。

ブートはマイクロサービスの開発にも広く使用されています。多くの成果物に同じ依存関係を何度も含めることは、リソースの重要な浪費になる可能性があるため、これは「ファットJAR」アプローチと時々矛盾す​​る可能性があります。

2前提条件

まず最初に、Spring Bootプロジェクトが必要です。この記事では、MavenのビルドとGradleのビルドを最も一般的な構成で説明します。

すべての構築システムと構築構成を網羅することは不可能ですが、できれば、特定の設定に適用できるようにするための一般原則について十分に検討します。

2.1. Mavenプロジェクト

MavenでビルドされたBootプロジェクトでは、Spring Boot Mavenプラグインをプロジェクトの pom.xml ファイル、その親、またはその先祖の1つに設定する必要があります。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

ここでは、プラグインのバージョンhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22spring-boot-maven-plugin%22[2.0.2.RELEASE]を参照しています。 、執筆時点で最新。 Spring Bootの依存関係のバージョンは、通常、BOMを使用するか、または参照プロジェクトのように親POMから継承することによって決定されます。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/>
</parent>

2.2. Gradleプロジェクト

GradleでビルドされたBootプロジェクトには、Boot Gradleプラグインがあります。

buildscript {
    ext {
        springBootPlugin = 'org.springframework.boot:spring-boot-gradle-plugin'
        springBootVersion = '2.0.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("${springBootPlugin}:${springBootVersion}")
    }
}
//elided

apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

springBoot {
    mainClassName = 'org.baeldung.DemoApplication'
}

この記事では、Boot 2.x以降のプロジェクトのみを検討します。 Thin Launcherは以前のバージョンもサポートしていますが、簡単にするために省略しているGradleの構成が少し異なります。詳細についてはプロジェクトのホームページをご覧ください。

** 3シンJARを作成する方法?

Spring Boot Thin Launcherは、アーカイブ自体にバンドルされているファイルからアーティファクトの依存関係を読み取り、それらをMavenリポジトリからダウンロードして、最後にアプリケーションのメインクラスを起動する小さなライブラリです。

そのため、** ライブラリを使ってプロジェクトをビルドすると、コードを含むJARファイル、その依存関係を列挙したファイル、および上記のタスクを実行するライブラリからのメインクラスが得られます。

もちろん、物事は私たちの単純化された説明より少し微妙です。この記事の後半で、いくつかのトピックについて詳しく説明します。

** 4基本的な使い方

それでは、通常のSpring Bootアプリケーションから「シン」JARを作成する方法を見てみましょう。

通常の__java -jar <my-app-1.0.jar>と、Thin Launcherを制御するオプションの追加コマンドライン引数を使用してアプリケーションを起動します。次のセクションでそれらのいくつかを見ます。プロジェクトのホームページには完全なリストが含まれています。

4.1. Mavenプロジェクト

Mavenプロジェクトでは、カスタムの「thin」レイアウトへの依存関係を含めるためにBootプラグインの宣言(セクション2.1を参照)を変更する必要があります。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <dependencies>
        <!-- The following enables the "thin jar" deployment option. -->
        <dependency>
            <groupId>org.springframework.boot.experimental</groupId>
            <artifactId>spring-boot-thin-layout</artifactId>
            <version>1.0.11.RELEASE</version>
        </dependency>
    </dependencies>
</plugin>

launcher は、Mavenが保管する pom.xml ファイルから依存関係を読み取ります。 META-INF/maven ディレクトリにJARを生成しました。

  • mvn install を使って、通常どおりにビルドを実行します。

シンビルドとファットビルドの両方を作成できるようにしたい場合(たとえば、複数のモジュールを含むプロジェクトで)、専用のMavenプロファイルでカスタムレイアウトを宣言できます。

4.2. Mavenとその依存関係: thin.properties

  • pom.xml に加えて、Mavenに thin.properties ファイルを生成させることもできます** その場合、ファイルには推移的なものも含めて完全な依存関係のリストが含まれ、ランチャーは pom.xml よりも優先されます。

そのためのmojo(プラグイン)は spring-boot-thin-maven-plugin:propertiesであり、デフォルトでは src/main/resources/META-INF thin.properties ファイルを出力しますが、その場所を指定することもできます。 thin.output__プロパティを使用します。

$ mvn org.springframework.boot.experimental:spring-boot-thin-maven-plugin:properties -Dthin.output=.

目標を達成するには、デフォルトのディレクトリをそのまま使用しても、出力ディレクトリが存在している必要があります。

4.3. Gradleプロジェクト

Gradleプロジェクトでは、代わりに専用のプラグインを追加します。

buildscript {
    ext {
       //...
        thinPlugin = 'org.springframework.boot.experimental:spring-boot-thin-gradle-plugin'
        thinVersion = '1.0.11.RELEASE'
    }
   //...
    dependencies {
       //...
        classpath("${thinPlugin}:${thinVersion}")
    }
}
//elided

apply plugin: 'maven'
apply plugin: 'org.springframework.boot.experimental.thin-launcher'

薄いビルドを入手するには、Gradleに thinJar タスクを実行するように指示します。

~/projects/baeldung/spring-boot-gradle $ ./gradlew thinJar

4.4. Gradleと依存関係: pom.xml

前のセクションのコード例では、Thin Launcherに加えてMavenプラグインを宣言しました(また、既に前提条件のセクションで見たBoot and Dependency Managementプラグインも同様です)。

これは、前に見たMavenの場合のように、アーティファクトはアプリケーションの依存関係を列挙した pom.xml ファイルを含み、それを利用するためです。 pom.xml ファイルは thinPom という名前のタスクによって生成されます。これは、すべてのjarタスクの暗黙的な依存関係です。

  • 生成された pom.xml ファイルを専用のタスクでカスタマイズすることができます** ここでは、シンプラグインが既に自動的に行っていることを複製するだけです。

task createPom {
    def basePath = 'build/resources/main/META-INF/maven'
    doLast {
        pom {
            withXml(dependencyManagement.pomConfigurer)
        }.writeTo("${basePath}/${project.group}/${project.name}/pom.xml")
    }
}

カスタムの pom.xml ファイルを使用するには、上記のタスクをjarタスクの依存関係に追加します。

bootJar.dependsOn =[createPom]----

====  **  4.5. 卒業生とその依存関係:__thin.properties__ **

** 以前にMavenで行ったように、Gradleに__pom.xml __ではなく__thin.properties__ファイルを生成させることもできます。

__thin.properties__ファイルを生成するタスクは__thinPropertiesと呼ばれ、デフォルトでは使用されません。 jarタスクの依存関係として追加できます。

[source,groovy,gutter:,true]

bootJar.dependsOn =[thinProperties]----

5依存関係を保存する

細い瓶の全体的なポイントは、依存関係をアプリケーションとバンドルすることを避けることです。ただし、依存関係は魔法のように消えることはなく、単に他の場所に保存されているだけです。

特に、Thin LauncherはMavenインフラストラクチャを使用して依存関係を解決します。

  1. ローカルのMavenリポジトリをチェックします. デフォルトでは、

〜/.m2/repository しかし他の場所に移動することができます。 。それから、それはMaven Central(または任意の

その他の設定済みリポジトリ) 。最後に、ローカルリポジトリにそれらをキャッシュします。

次回アプリケーションを実行するときにそれらを再度ダウンロードする

もちろん、** ダウンロードフェーズは、インターネットを介したMaven Centralへのアクセス、またはローカルプロキシへのアクセスを必要とするため、処理が遅くエラーが発生しやすい部分です。

幸いなことに、依存関係をアプリケーションと一緒にデプロイする方法はいくつかあります。たとえば、クラウドデプロイ用のパッケージ化されたコンテナなどです。

5.1. ウォームアップ のためのアプリケーションの実行

依存関係をキャッシュする最も簡単な方法は、ターゲット環境でアプリケーションのウォームアップ実行を行うことです。前述したように、これにより依存関係がダウンロードされ、ローカルのMavenリポジトリにキャッシュされます。複数のアプリを実行した場合、リポジトリには重複することなくすべての依存関係が含まれます。

アプリケーションを実行すると望ましくない副作用が発生する可能性があるので、 ユーザーコードを実行せずに依存関係のみを解決してダウンロードする「ドライラン」を実行することもできます。

$ java -Dthin.dryrun=true -jar my-app-1.0.jar

Spring Bootの規約に従って、 -Dthin.dryrun プロパティをアプリケーションの – thin.dryrun コマンドライン引数または THIN DRYRUN システムプロパティで設定することもできます。 false__以外の値は、Thin Launcherにドライランを実行するよう指示します。

** 5.2. ビルド中に依存関係をパッケージ化する

**

もう1つの選択肢は、依存関係をJARにまとめずに、ビルド中に依存関係を収集することです。その後、展開手順の一部としてそれらをターゲット環境にコピーできます。

ターゲット環境でアプリケーションを実行する必要がないため、これは一般的に簡単です。ただし、複数のアプリケーションを展開している場合は、それらの依存関係を手動またはスクリプトでマージする必要があります。

MavenおよびGradle用のThin Pluginがビルド中に依存関係をパッケージ化する形式は、Mavenローカルリポジトリと同じです。

root/    repository/        com/        net/        org/        ...

実際、シンランチャーを使用するアプリケーションは、実行時に thin.root プロパティを使用してそのようなディレクトリ(ローカルのMavenリポジトリを含む)を指すことができます。

$ java -jar my-app-1.0.jar --thin.root=my-app/deps

これらのディレクトリを他のディレクトリにコピーして安全にマージすることもできます。これにより、必要なすべての依存関係を含むMavenリポジトリを取得できます。

** 5.3. Mavenによる依存関係のパッケージ化

**

Mavenに依存関係をパッケージ化させるために、 spring-boot-thin-maven-pluginの resolve__ゴールを使用します。

<plugin>
    <groupId>org.springframework.boot.experimental</groupId>
    <artifactId>spring-boot-thin-maven-plugin</artifactId>
    <version>${thin.version}</version>
    <executions>
        <execution>
        <!-- Download the dependencies at build time -->
        <id>resolve</id>
        <goals>
            <goal>resolve</goal>
        </goals>
        <inherited>false</inherited>
        </execution>
    </executions>
</plugin>

プロジェクトをビルドすると、前のセクションで説明した構造を持つディレクトリ target/thin/root/ が見つかります。

5.4. 依存関係をGradle でパッケージする

Gradleを thin-launcher プラグインと併用している場合は、代わりに thinResolve タスクを利用できます。前のセクションのMavenプラグインと同様に、タスクは build/thin/root/ ディレクトリにアプリケーションとその依存関係を保存します。

$ gradlew thinResolve

この記事の執筆時点では、 thin-launcher プラグインには、 thin.properties が使用されていると依存関係を保存できないというバグがあります。問題/53。

6. 結論とさらなる読み方

この記事では、細い瓶の作り方を見ました。また、Mavenインフラストラクチャを使用してそれらの依存関係をダウンロードして保存する方法も見ました。

Thin Launcherのhttps://github.com/dsyer/spring-boot-thin-launcher[homepage]には、Herokuへのクラウド展開などのシナリオに関するいくつかのHOW-TOガイド、およびサポートされているすべての一覧があります。コマンドライン引数

すべてのMavenの例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/spring-boot-bootstrap[GitHubプロジェクト]にあります - Mavenプロジェクトとして、そうあるべきですそのままインポートして実行するのは簡単です。

同様に、Gradleの例はすべてhttps://github.com/eugenp/tutorials/tree/master/spring-boot-gradle[このGitHubプロジェクト]を参照しています。