メイン構成:
<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問題を解決するためのガイド:
主要な構成手順については、次のメモを参照してください:
<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
実装効果:
参照プロジェクト ディレクトリ: package-optimize-level2
問題の解決:#モジュールに依存するすべての jar を同じ lib ディレクトリにマージします。一般に、各モジュールの依存する jar には高度な重複があるため、モジュール プロジェクト、すべてのサービス デプロイメントをマージする 合計ファイル サイズは基本的に 200 ~ 300 MB
主要な構成の詳細な手順を示してください。次のコメントを参照してください。
<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 パラメーターが必要なくなりました。意味。
#参照プロジェクト ディレクトリ: package-optimize-level3
問題の解決策:#SDK jar などの非公式のサードパーティを実行する 1 つの方法は、参照のためにそれらを Maven ローカル プライベート サーバーに送信することです。これは通常の依存 jar と同じです。処理は同じですが、Maven プライベート サーバーがない場合、一般的な簡略化方法は、依存 jar をプロジェクトに直接配置し、システム スコープを持つ pom で定義することです。 。
メイン構成:
<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 になり、最初の導入時の伝送効率が大幅に向上します。
以上がSpringBoot に Jar ファイルをデプロイする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。