Konfigurasi utama:
<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>
Output konfigurasi:
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
Kata kunci:
(Aplikasi demo semasa hanya bergantung pada beberapa komponen spring-boot-starter-web, dan semua output binaan hanya kira-kira sepuluh MB Dalam situasi sebenar, balang output bagi satu binaan bergantung pada jumlah komponen yang bergantung kepada projek, secara amnya antara puluhan MB hingga satu Dua ratus MB atau lebih.
Jika anda perlu menggunakan sedozen perkhidmatan mikro, anda perlu memindahkan beberapa GB fail, yang akan memakan banyak masa. Malah satu kemas kini kepada perkhidmatan mikro individu memerlukan pemindahan satu hingga dua ratus MB.
Tahap 1: Kaedah pembinaan pemisahan balang bergantung biasa
Direktori projek rujukan: package-optimize-level1
Tutup penyelesaian masalah:
Kurangkan saiz fail satu balang perkhidmatan mikro supaya fail boleh dipindahkan dalam beberapa saat semasa proses penempatan. Konfigurasi utama:
Untuk arahan konfigurasi utama, sila lihat nota berikut:
<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>
Output konfigurasi:
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
Kesan pencapaian:
Balang keluaran bagi binaan tunggal secara amnya hanya satu atau dua ratus KB berdasarkan jumlah komponen yang bergantung kepada projek, dan pada dasarnya ia boleh dipindahkan dalam beberapa saat.
Ini ialah penyelesaian pengoptimuman yang paling biasa dilihat di Internet, dan ia patut diterokai lebih lanjut: Jika terdapat sedozen perkhidmatan mikro, setiap perkhidmatan mempunyai balang dan fail direktori lib, penempatan pertama adalah serupa. Satu atau dua fail GB perlu dipindahkan.
Tahap 2: Gabungkan semua balang bergantung modul ke dalam direktori lib yang sama
Direktori projek rujukan: package-optimize-level2
Selesaikan masalah:
Gabungkan semua balang bergantung kepada modul ke dalam direktori lib yang sama Secara umumnya, disebabkan oleh tahap pertindihan yang tinggi dalam balang bergantung bagi setiap satu projek modul, gabungkan semua penggunaan perkhidmatan Jumlah saiz fail pada asasnya adalah dua hingga tiga ratus MB
Tetapi jika anda menggunakan -Djava.ext.dirs=lib untuk memuatkan semua balang ke dalam setiap JVM, setiap JVM akan dimuat sepenuhnya. >Sila berikan butiran tentang arahan konfigurasi utama Lihat anotasi berikut:
<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>
Fail META-INFO/MANIFEST dalam fail balang perkhidmatan mikro akan menjana atribut Laluan Kelas berdasarkan senarai komponen bergantung kepada modul, dengan itu mengelakkan versi balang yang berbeza: 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.jarKesan pelaksanaan:
Proses permulaan tidak lagi memerlukan parameter -Djava.ext.dirs=lib takrifan.
Semua balang perkhidmatan mikro merujuk kepada direktori awam semua komponen bergantung gabungan projek Saiz keseluruhan fail penggunaan biasanya dua hingga tiga ratus MB.
Dengan menyesuaikan Laluan Kelas dalam fail META-INFO/MANIFEST dalam setiap fail balang perkhidmatan mikro untuk menunjukkan dengan jelas kelas komponen versi bergantung, masalah versi komponen berbeza bercanggah dalam setiap perkhidmatan mikro boleh diselesaikan.
Direktori projek rujukan: package-optimize-level3
Bagi sesetengah balang pihak ketiga tidak rasmi seperti balang sdk, satu cara adalah dengan menyerahkannya kepada pelayan peribadi tempatan Maven untuk rujukan , yang sama dengan balang bergantung biasa Pemprosesannya adalah sama; tetapi jika tiada pelayan peribadi maven, kaedah penyederhanaan biasa ialah meletakkan balang bergantung secara langsung dalam projek dan kemudian menentukannya dalam pom dengan skop sistem. .
Untuk komponen maven-jar-plugin yang diperkenalkan dalam pom melalui systemPath, tiada pengisytiharan parameter langsung untuk komponen yang mengandungi skop yang ditentukan Jika tiada pemprosesan khas dilakukan META-INFO/MANIFEST Komponen yang ditakrifkan oleh skop ini tidak akan muncul, menyebabkan kelas masa jalan tidak ditemui.
Sila rujuk ulasan berikut untuk arahan konfigurasi utama:
<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>
<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>
Fail META-INFO/MANIFEST dalam fail balang output perkhidmatan mikro akan menjana atribut Laluan Kelas berdasarkan senarai komponen yang bergantung kepada modul dan nilai definisi atribut jar-manifestEntries-classpath akan dilampirkan ke hadapan: 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.jarKesan pelaksanaan akhir
Bergantung komponen semua perkhidmatan digabungkan menjadi satu direktori, Saiz keseluruhan ialah dua hingga tiga ratus MB, dan kecekapan penghantaran dipercepatkan dengan ketara semasa penggunaan pertama.
Setiap balang perkhidmatan mikro bersaiz satu hingga dua ratus KB Pembetulan pepijat kecemasan harian dan kemas kini pada balang individu pada asasnya serta-merta.
Setiap balang perkhidmatan mikro mentakrifkan senarai komponen yang bergantung pada versi yang ditentukan, jadi tidak akan ada konflik pemuatan antara versi komponen yang berbeza.
Komponen bergantung pihak ketiga tidak rasmi juga boleh dirujuk dan diproses seperti biasa.
Atas ialah kandungan terperinci Bagaimana untuk menggunakan fail Jar dalam SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!