ホームページ  >  記事  >  Java  >  SpringBoot に Jar ファイルをデプロイする方法

SpringBoot に Jar ファイルをデプロイする方法

WBOY
WBOY転載
2023-05-24 13:15:23780ブラウズ

メイン構成:

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

構成出力:

cd package-optimize-level0
mvn clean install

ls -lh package-optimize-app1/target/package-optimize-app1.jar
-rw-r--r--  1 lixia  wheel    16M Feb 24 21:06 package-optimize-app1/target/package-optimize-app1.jar

java -jar package-optimize-app1/target/package-optimize-app1.jar

キーワード:

  • (現在のデモ アプリケーションは spring-boot-starter-web のいくつかのコンポーネントにのみ依存しており、すべてのビルド出力はわずか約 10 MB です。) 実際の状況では、単一のビルドの出力 jar は通常次のようになります。プロジェクト依存コンポーネントの量に応じて、数十 MB から 1 MB まで、200 MB 以上。

  • 十数のマイクロサービスをデプロイする必要がある場合は、数ギガバイトのファイルを転送する必要があり、多くの時間がかかります。個々のマイクロサービスを 1 回更新するだけでも、1 ~ 200 MB の転送が必要です。

#レベル 1: 共通の依存関係 jar 分離構築方法

参照プロジェクト ディレクトリ: package-optimize-level1

問題を解決するためのガイド:

  • 単一のマイクロサービス jar のファイル サイズを削減して、デプロイメント プロセス中にファイルを数秒で転送できるようにします。メイン構成:

主要な構成手順については、次のメモを参照してください:

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <!-- 拷贝项目所有依赖jar文件到构建lib目录下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>true</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模块jar构建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

構成出力:

cd package-optimize-level1
mvn clean install

ls -lh package-optimize-app1/target/package-optimize-app1.jar
-rw-r--r--  1 lixia  wheel   149K Feb 24 20:56 package-optimize-app1/target/package-optimize-app1.jar

java -jar -Djava.ext.dirs=lib package-optimize-app1/target/package-optimize-app1.jar

実装効果:

  • #単一ビルドの出力 jar は、プロジェクトに依存するコンポーネントの量に基づいて、通常、わずか 100 〜 200 KB です。 , 基本的に数秒で転送できます。

  • これはインターネット上で見られる最も一般的な最適化ソリューションであり、さらに検討する価値があります。12 個のマイクロサービスがある場合、各サービスには jar と lib ディレクトリ ファイルがあり、最初の展開も同様ですが、1 GB または 2 GB のファイルを転送する必要があります。

#レベル 2: すべてのモジュールに依存する jar を同じ lib ディレクトリにマージします。

参照プロジェクト ディレクトリ: package-optimize-level2

問題の解決:

#モジュールに依存するすべての jar を同じ lib ディレクトリにマージします。一般に、各モジュールの依存する jar には高度な重複があるため、モジュール プロジェクト、すべてのサービス デプロイメントをマージする 合計ファイル サイズは基本的に 200 ~ 300 MB
  • ただし、-Djava.ext.dirs=lib を使用してすべての jar を各 JVM にロードすると、各 JVM は完全にロードされます。すべての jar はリソースを消費します。第 2 に、各マイクロサービス コンポーネントのバージョンが異なると、バージョンの競合が発生する可能性があります。
  • メイン構成:

主要な構成の詳細な手順を示してください。次のコメントを参照してください。

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <!-- 基于maven-jar-plugin插件实现把依赖jar定义写入输出jar的META-INFO/MANIFEST文件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <useUniqueVersions>false</useUniqueVersions>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!-- 拷贝项目所有依赖jar文件到构建lib目录下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <!--
                        各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录
                        详见各子模块中 boot-jar-output 属性定义
                        -->
                        <outputDirectory>${boot-jar-output}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>false</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模块jar构建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
                <!--
                基于maven-jar-plugin输出微服务jar文件进行二次spring boot重新打包文件的输出目录
                所有微服务构建输出jar文件统一输出到与lib同一个目录,便于共同引用同一个lib目录
                详见各子模块中boot-jar-output属性定义
                -->
                <!--  -->
                <outputDirectory>${boot-jar-output}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
各マイクロサービスによって構築されたすべての lib ディレクトリ ファイルと jar は、devops パブリック ディレクトリに集約されます。

マイクロサービス jar ファイル内の META-INFO/MANIFEST ファイルは、モジュールの依存コンポーネント リストに基づいて Class-Path 属性を生成するため、jar の異なるバージョンが回避されます:

Class-Path: lib/spring-boot-starter-web-2.4.3.jar lib/spring-boot-starte
 r-2.4.3.jar lib/spring-boot-2.4.3.jar lib/spring-boot-autoconfigure-2.4
 .3.jar lib/spring-boot-starter-logging-2.4.3.jar lib/logback-classic-1.
 2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-api-1.7.30.jar lib/log4j-t
 o-slf4j-2.13.3.jar lib/log4j-api-2.13.3.jar lib/jul-to-slf4j-1.7.30.jar
  lib/jakarta.annotation-api-1.3.5.jar lib/spring-core-5.3.4.jar lib/spr
 ing-jcl-5.3.4.jar lib/snakeyaml-1.27.jar lib/spring-boot-starter-json-2
 .4.3.jar lib/jackson-databind-2.11.4.jar lib/jackson-annotations-2.11.4
 .jar lib/jackson-core-2.11.4.jar lib/jackson-datatype-jdk8-2.11.4.jar l
 ib/jackson-datatype-jsr310-2.11.4.jar lib/jackson-module-parameter-name
 s-2.11.4.jar lib/spring-boot-starter-tomcat-2.4.3.jar lib/tomcat-embed-
 core-9.0.43.jar lib/jakarta.el-3.0.3.jar lib/tomcat-embed-websocket-9.0
 .43.jar lib/spring-web-5.3.4.jar lib/spring-beans-5.3.4.jar lib/spring-
 webmvc-5.3.4.jar lib/spring-aop-5.3.4.jar lib/spring-context-5.3.4.jar 
 lib/spring-expression-5.3.4.jar

構成出力:

cd package-optimize-level2
mvn clean install

ls -lh devops/
total 912
drwxr-xr-x  34 lixia  wheel   1.1K Feb 24 22:27 lib
-rw-r--r--   1 lixia  wheel   150K Feb 24 22:31 package-optimize-app1.jar
-rw-r--r--   1 lixia  wheel   149K Feb 24 22:31 package-optimize-app2.jar
-rw-r--r--   1 lixia  wheel   149K Feb 24 22:31 package-optimize-app3.jar

java -jar devops/package-optimize-app1.jar
実装効果:

起動プロセスに -Djava.ext.dirs=lib パラメーターが必要なくなりました。意味。
  • すべてのマイクロサービス jar は、すべてのプロジェクトとマージされた依存コンポーネントの共通ディレクトリを参照します。デプロイメント ファイルの合計サイズは、通常 2 ~ 300 MB です。
  • 各マイクロサービスの jar ファイルの META-INFO/MANIFEST ファイルのクラスパスをカスタマイズして、依存するバージョン コンポーネントを明確に示すことで、各マイクロサービスのさまざまなコンポーネントのバージョンの競合の問題を解決します。クラス。
  • #レベル 3: システムによって導入された非公式のサードパーティ依存コンポーネントのサポート

#参照プロジェクト ディレクトリ: package-optimize-level3

問題の解決策:

#SDK jar などの非公式のサードパーティを実行する 1 つの方法は、参照のためにそれらを Maven ローカル プライベート サーバーに送信することです。これは通常の依存 jar と同じです。処理は同じですが、Maven プライベート サーバーがない場合、一般的な簡略化方法は、依存 jar をプロジェクトに直接配置し、システム スコープを持つ pom で定義することです。 。

  • systemPath を介して pom に導入される maven-jar-plugin コンポーネントの場合、指定されたスコープを含むコンポーネントの直接パラメーター宣言はありません。 META-INFO/MANIFEST これらのスコープで定義されたコンポーネントは表示されず、ランタイム クラスが見つからなくなります。

  • メイン構成:

主要な構成手順については、次のコメントを参照してください。

<build>
    <finalName>${project.artifactId}</finalName>
    <!--
    特别注意:
    项目仅仅是为了演示配置方便,直接在parent的build部分做了插件配置和运行定义。
    但是实际项目中需要把这些定义只放到spring boot模块项目(可优化使用pluginManagement形式),避免干扰其他util、common等模块项目
    -->
    <plugins>
        <!-- 基于maven-jar-plugin插件实现把依赖jar定义写入输出jar的META-INFO/MANIFEST文件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <useUniqueVersions>false</useUniqueVersions>
                    </manifest>
                    <manifestEntries>
                        <!--
                        有些非官方三方的诸如sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件
                        通过使用额外定义 Class-Path 值来追加指定依赖组件列表,在子模块按实际情况指定 jar-manifestEntries-classpath 值即可
                        例如(注意前面个点字符及各空格分隔符):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar
                        详见各子模块中 boot-jar-output 属性定义示例
                        -->
                        <Class-Path>${jar-manifestEntries-classpath}</Class-Path>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <!-- 拷贝项目所有依赖jar文件到构建lib目录下 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <!--
                        各子模块按照实际层级定义各模块对应的属性值,检查所有微服务模块依赖jar文件合并复制到同一个目录
                        详见各子模块中 boot-jar-output 属性定义
                        -->
                        <outputDirectory>${boot-jar-output}/lib</outputDirectory>
                        <excludeTransitive>false</excludeTransitive>
                        <stripVersion>false</stripVersion>
                        <silent>false</silent>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- Spring Boot模块jar构建 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includes>
                    <!-- 不存在的include引用,相当于排除所有maven依赖jar,没有任何三方jar文件打入输出jar -->
                    <include>
                        <groupId>null</groupId>
                        <artifactId>null</artifactId>
                    </include>
                </includes>
                <layout>ZIP</layout>
                <!--
                基于maven-jar-plugin输出微服务jar文件进行二次spring boot重新打包文件的输出目录
                所有微服务构建输出jar文件统一输出到与lib同一个目录,便于共同引用同一个lib目录
                详见各子模块中boot-jar-output属性定义
                -->
                <!--  -->
                <outputDirectory>${boot-jar-output}</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
サブのメイン構成module:
    <properties>
        <!-- 按各模块实际目录层次定义相对数据,使所有服务模块输出资源汇聚到相同目录 -->
        <boot-jar-output>../devops</boot-jar-output>
        <!--
        有些供应商的sdk jar在pom中是以systemPath方式引入的,maven-jar-plugin组件没有直接参数声明包含指定scope的组件
        通过使用额外定义 Class-Path 值来追加指定依赖组件列表,按实际情况指定 jar-manifestEntries-classpath 值即可
        例如(注意前面个点字符及各空格分隔符,lib后面部分是 artifactId-version.jar 格式而不是实际文件名):. lib/xxx-1.0.0.jar lib/yyy-2.0.0.jar
        -->
        <jar-manifestEntries-classpath>. lib/hik-sdk-1.0.0.jar</jar-manifestEntries-classpath>
    </properties>
    <dependencies>
        <!-- 以相对路径方式定义非官方三方依赖组件 -->
        <dependency>
            <groupId>com.hik</groupId>
            <artifactId>hik-sdk</artifactId>
            <version>1.0.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/hik-sdk-1.0.0.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
マイクロサービス出力 jar ファイル内の META-INFO/MANIFEST ファイルは、モジュール依存コンポーネント リストに基づいて Class-Path 属性を生成し、jar-manifestEntries-classpath 属性定義値が追加されます。前面へ:

Class-Path: . lib/hik-sdk-1.0.0.jar lib/spring-boot-starter-web-2.4.3.ja
 r lib/spring-boot-starter-2.4.3.jar lib/spring-boot-2.4.3.jar lib/sprin
 g-boot-autoconfigure-2.4.3.jar lib/spring-boot-starter-logging-2.4.3.ja
 r lib/logback-classic-1.2.3.jar lib/logback-core-1.2.3.jar lib/slf4j-ap
 i-1.7.30.jar lib/log4j-to-slf4j-2.13.3.jar lib/log4j-api-2.13.3.jar lib
 /jul-to-slf4j-1.7.30.jar lib/jakarta.annotation-api-1.3.5.jar lib/sprin
 g-core-5.3.4.jar lib/spring-jcl-5.3.4.jar lib/snakeyaml-1.27.jar lib/sp
 ring-boot-starter-json-2.4.3.jar lib/jackson-databind-2.11.4.jar lib/ja
 ckson-annotations-2.11.4.jar lib/jackson-core-2.11.4.jar lib/jackson-da
 tatype-jdk8-2.11.4.jar lib/jackson-datatype-jsr310-2.11.4.jar lib/jacks
 on-module-parameter-names-2.11.4.jar lib/spring-boot-starter-tomcat-2.4
 .3.jar lib/tomcat-embed-core-9.0.43.jar lib/jakarta.el-3.0.3.jar lib/to
 mcat-embed-websocket-9.0.43.jar lib/spring-web-5.3.4.jar lib/spring-bea
 ns-5.3.4.jar lib/spring-webmvc-5.3.4.jar lib/spring-aop-5.3.4.jar lib/s
 pring-context-5.3.4.jar lib/spring-expression-5.3.4.jar

構成出力:

cd package-optimize-level3
mvn clean install

ls -lh devops/
total 912
drwxr-xr-x  36 lixia  wheel   1.1K Feb 24 23:14 lib
-rw-r--r--@  1 lixia  wheel   150K Feb 24 23:14 package-optimize-app1.jar
-rw-r--r--   1 lixia  wheel   150K Feb 24 23:14 package-optimize-app2.jar
-rw-r--r--   1 lixia  wheel   150K Feb 24 23:14 package-optimize-app3.jar

java -jar devops/package-optimize-app1.jar

最終実装効果

依存関係すべてのサービスのコンポーネントが 1 つのディレクトリにマージされ、合計サイズは 200 ~ 300 MB になり、最初の導入時の伝送効率が大幅に向上します。

  • 各マイクロサービス jar のサイズは 1 ~ 200 KB で、毎日の緊急バグ修正と個々の jar の更新は基本的に瞬時に行われます。

  • 各マイクロサービス jar は、指定されたバージョンに依存するコンポーネントのリストを定義するため、コンポーネントの異なるバージョン間で読み込みの競合は発生しません。

  • 非公式のサードパーティ依存コンポーネントも、通常どおり参照および処理できます。

以上がSpringBoot に Jar ファイルをデプロイする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。