Heim >Java >javaLernprogramm >So stellen Sie Jar-Dateien in SpringBoot bereit
Hauptkonfiguration:
<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>
Konfigurationsausgabe:
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
Wichtige Hinweise:
(Die aktuelle Demoanwendung basiert nur auf sehr wenigen Komponenten von Spring-Boot-Starter-Web, und alle Build-Ausgaben sind es (nur etwa ein Dutzend MB) In tatsächlichen Situationen hängt die Ausgabe-JAR-Datei eines einzelnen Builds von der Menge der projektabhängigen Komponenten ab und liegt im Allgemeinen zwischen mehreren zehn MB und einem oder zweihundert MB oder sogar mehr.
Wenn Sie ein Dutzend Microservices bereitstellen müssen, müssen Sie mehrere GB an Dateien übertragen, was viel Zeit in Anspruch nimmt. Schon ein einzelnes Update eines einzelnen Microservice erfordert die Übertragung von ein bis zweihundert MB.
Stufe 1: Gemeinsame Konstruktionsmethode zur Trennung von Abhängigkeitsgläsern
Referenzprojektverzeichnis: package-optimize-level1
Off-Problemlösung:
Reduzieren Sie die Dateigröße eines einzelnen Microservice-Jars, um die Bereitstellung zu erleichtern Der Dateiübertragungsvorgang dauert Sekunden. Hauptkonfiguration:
Weitere Informationen zu wichtigen Konfigurationsanweisungen finden Sie in den folgenden Hinweisen:
<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>
Konfigurationsausgabe:
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
Erfolgseffekt:
Ein einzelner Build gibt im Allgemeinen nur Gläser aus basiert von der Menge der projektabhängigen Komponenten. Mit ein oder zweihundert KB ist die Übertragung grundsätzlich in Sekundenschnelle möglich.
Dies ist die am weitesten verbreitete Optimierungslösung im Internet, und es lohnt sich, sie weiter zu untersuchen: Wenn es ein Dutzend Mikrodienste gibt und jeder Dienst über eine JAR- und eine LIB-Verzeichnisdatei verfügt, ist bei der ersten Bereitstellung fast eine Übertragung erforderlich ein oder zwei GB Dateien.
Level 2: Alle modulabhängigen Jars im selben lib-Verzeichnis zusammenführen
Referenzprojektverzeichnis: package-optimize-level2
Das Problem wurde gelöst:
Alle modulabhängigen Jars im selben zusammenführen lib-Verzeichnis, da jedes Modulprojekt auf einem hohen Grad an JAR-Überlappung basiert, beträgt die Gesamtgröße aller Dienstbereitstellungsdateien im Allgemeinen zweihundert bis dreihundert MB
Wenn jedoch -Djava.ext.dirs = lib ist Wird zum Laden aller Jars in jede JVM verwendet. Erstens lädt jede JVM alle Jars vollständig und verbraucht Ressourcen. Zweitens verursachen unterschiedliche Versionen jeder Microservice-Komponente Versionskonflikte.
Anweisungen zur Schlüsselkonfiguration. Weitere Informationen finden Sie in den folgenden Hinweisen:
<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>
Alle von jedem Mikrodienst erstellten lib-Verzeichnisdateien und JAR-Dateien werden im öffentlichen Devops-Verzeichnis zusammengefasst.
Die META-INFO/MANIFEST-Datei in der Microservice-JAR-Datei generiert das Class-Path-Attribut basierend auf der modulabhängigen Komponentenliste und vermeidet so unterschiedliche Versionen von 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.jarKonfigurationsausgabe:
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
Für die Maven-Jar-Plugin-Komponente, die im POM über systemPath eingeführt wird, verfügt die Maven-Jar-Plugin-Komponente nicht über direkte Parameter zum Deklarieren von Komponenten, die den angegebenen Bereich enthalten -definierte Komponenten werden nicht in META-INFO/MANIFEST angezeigt, was dazu führt, dass die Laufzeitklasse nicht gefunden wird.
Hauptkonfiguration:
<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>Hauptkonfiguration des Untermoduls:
<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>
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.jarEndgültiger Implementierungseffekt Die abhängigen Komponenten aller Dienste werden zu einem zusammengeführt. Die Gesamtgröße des Verzeichnisses beträgt zwei bis dreihundert MB, und die Übertragungseffizienz wird bei der ersten Bereitstellung erheblich beschleunigt.
Jedes Microservice-Jar ist ein bis zweihundert KB groß. Tägliche Notfall-Fehlerbehebungen und Updates für einzelne Jars erfolgen grundsätzlich sofort.
Jedes Microservice-JAR definiert eine Liste von Komponenten, die von der angegebenen Version abhängen, sodass es keine Ladekonflikte zwischen verschiedenen Komponentenversionen gibt.
Das obige ist der detaillierte Inhalt vonSo stellen Sie Jar-Dateien in SpringBoot bereit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!